在Objective-C/iPhone应用程序中使用"经典"malloc()/ free()是否可以?

Phi*_*ert 55 c memory-management objective-c

我已经玩了一段时间的iPhone开发,虽然当你是一个"硬核".NET开发人员时感觉有点尴尬,但是一旦你习惯它就不会那么糟糕.

在我读到的关于Objective-C的每本书中,都只讨论了内存管理的保留/释放(引用计数).作为一个古老的C/C++开发人员,使用malloc()和free()分配"正常"方式似乎很奇怪只在一些脚注中提到.

我知道malloc()和free()在Objective-C中工作,但我很好奇它是否是常见的做法.毕竟,如果我想分配一个包含100个整数的数组,那么这似乎是最有效的方法:

int *array = malloc(sizeof(int) * 100);

memset(array,0,sizeof(int) * 100);

// use the array

free(array);
Run Code Online (Sandbox Code Playgroud)

这确实是最好的方式,还是应该避免普通的C内存管理?

Nik*_*uhe 81

有一个关于原始内存的Objective-C包装器,我喜欢将它用于类似的任务:NSMutableData.它具有为您提供保留/释放所有权的好处,而且它可以轻松扩展阵列(无需您自己重新分配).

您的代码如下所示:

NSMutableData* data = [NSMutableData dataWithLength:sizeof(int) * 100];
int* array = [data mutableBytes];
// memory is already zeroed

// use the array

// decide later that we need more space:
[data setLength:sizeof(int) * 200];
array = [data mutableBytes]; // re-fetch pointer in case memory needed to be copied

// no need to free
// (it's done when the autoreleased object is deallocated)
Run Code Online (Sandbox Code Playgroud)

  • @ iPadDeveloper2011您必须重新阅读http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html上的"内存管理编程指南". (5认同)
  • 我喜欢这个答案.当我需要使用整数数组并丢失引用计数并且能够轻松扩展它时,我总是感到困扰.感谢非常好的解释和例子! (3认同)

Ada*_*eld 48

这完全没问题 - Objective-C是C的严格超集,所以如果你想写简单的C,没有什么能阻止你这样做.在许多情况下,使用mallocfree避免Objective-C运行时的开销是有利的.

例如,如果您需要动态分配一个未知数量的整数数组,那么它通常更简单,更容易:

int *array = malloc(N * sizeof(int));  // check for NULL return value!
// use array[0]..array[N-1]
...
free(array);
Run Code Online (Sandbox Code Playgroud)

与:

NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:N];
// use NSMutableArray methods to do stuff with array; must use NSNumbers instead
// of plain ints, which adds more overhead
...
[array release];
Run Code Online (Sandbox Code Playgroud)

我正在为iPhone制作文字游戏,我们不得不加载一个有效单词的多兆字典.单词列表被加载到一个char分配的巨型数组中malloc(),通过一些巧妙的优化来进一步减少内存大小.显然,对于这样的事情,使用a的开销NSArray在有限的iPhone上完全不切实际.我不确切知道开销是多少,但每个字符肯定不止一个字节.

  • RE:'严格超集'.虽然我个人(强烈)同意你的意见,但由于我们正在讨论Apple/iPhone开发,因此这种说法在技术上并不正确.Apple因此定义:`Objective-C语法是GNU C/C++语法的超集.严格的超集有一个非常具体的含义,超集的不合格使用是两者中的较小者(认为"表现得像"与"完全一样").`syntax`的限定符进一步将其限制在几乎无用的程度,有效地将苹果的义务限制在C99规范的附录A中 - 标准中552页中的16页. (6认同)

Ale*_*ski 5

当然,你可以使用这些函数,因为Objective-C只是C的超集.但是,做这种事情并不常见,因为Objective-C包含了使对象更容易的对象和方法.

毕竟,您可以将上面的代码编写为:

NSMutableArray *array = [[NSMutableArray alloc] init];

//Use the array, adding objects when need be

[array release];
Run Code Online (Sandbox Code Playgroud)

虽然你必须创建NSNumber存储ints的对象(因为NSArray不允许添加非对象类型),但通常使用对象更常见,因为它更容易移动数据,并且数组类被集成更常见的是与其他Cocoa类相比,内存管理通常比标准C内存管理更直接.

此外,如果您开始在数组中添加或删除对象,那么Cocoa数组对象使这更容易.

  • 如果你需要一个简单的整数数组,这似乎有些过分.特别是创建NSNumber对象的需求对我来说似乎效率低下.如果我想分配100,000个布尔数组怎么办? (2认同)