在objective-c中为原始类型分配内存的最佳实践

Posted

技术标签:

【中文标题】在objective-c中为原始类型分配内存的最佳实践【英文标题】:Best practice to allocate memory for primitive types in objective-c 【发布时间】:2011-11-14 12:56:03 【问题描述】:

在 Objective-c 中为原始类型分配内存的最佳做法是什么?

使用 C 分配是好的(malloc 和 free)

unsigned int* val = malloc(sizeof(unsigned int));
free(val);

或者是否有任何 obj-c 特定的分配?

如果一个函数需要一个指向 int 的指针,自己创建和管理指针,或者只是创建一个常规变量并使用 address-of 运算符发送其地址,那么哪个更好:

第一种形式:

NSScanner* scanner = [NSScanner scannerWithString: @"F"];
unsigned int* val = malloc(sizeof(unsigned int));
[scanner scanHexInt: val];
NSLog(@"%d", *val);
free(val);

第二种形式:

NSScanner* scanner = [NSScanner scannerWithString: @"F"];
unsigned int  val;
[scanner scanHexInt: &val];
NSLog(@"%d", val);

我自己用第二种形式将自己从 alloc-free 内存头痛中解脱出来。

【问题讨论】:

【参考方案1】:

两种形式都有效并且各有利弊,但在本示例中,第一种形式是额外的工作,并且与第二种形式相比具有负面的性能影响。

在第一种形式中,您将在堆上分配该 int,因此 malloc 的子系统必须执行簿记以确保有可用的分配。您还必须记住在正确的时间释放分配。

在第二种形式中,分配将在堆栈上进行,与 malloc 相比,它需要的簿记要少得多。当您离开此功能时,它也会自动免费为您服务。

使用 malloc/free 的关键时间是如果您希望变量的范围持续到当前函数之外。否则,当您离开函数时,堆栈将被弹出,您将丢失数据。

【讨论】:

最后一段he key time to use malloc/free is if you want the scope of your variable to last outside of the current function是最好的。

以上是关于在objective-c中为原始类型分配内存的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C的内存管理

我应该如何释放类型映射中为 argout 结构数组分配的内存?

关于javascript内存分配

谈一谈js的内存分配

为 Objective-C 数据对象分配内存的问题

.net 框架中值类型和引用类型的内存分配