我已经尝试过iPhone开发一段时间了,虽然当您是一个“铁杆”.NET开发人员时感觉有点笨拙,但是一旦您习惯了它,情况就不会那么糟糕了。
在我读到的每一本关于Objective-C的书中,都只谈到用于内存管理的retain
/release
(引用计数)。作为一个老派的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);
这真的是最好的方法吗,或者我应该避免纯C语言的内存管理?
发布于 2009-07-20 13:04:57
在原始内存中有一个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)
发布于 2009-07-19 19:37:51
这是非常好的-- Objective-C是C的严格超集,所以如果您想编写纯C语言,没有什么可以阻止您这样做。在许多情况下,使用malloc
和free
可以避免Objective-C运行时的开销。
例如,如果您需要动态分配一个包含未知数量的整数的数组,则通常会更简单、更容易:
int *array = malloc(N * sizeof(int)); // check for NULL return value!
// use array[0]..array[N-1]
...
free(array);
对比:
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];
我当时正在为iPhone开发一个单词游戏,我们必须加载一个多兆字节的有效单词字典。单词列表被加载到一个使用malloc()
分配的巨大char
数组中,并进行了一些巧妙的优化以进一步减少内存大小。显然,对于这样的事情,在有限的iPhone上使用NSArray
的开销是完全不切实际的。我不知道确切的开销是多少,但肯定是每个字符超过一个字节。
发布于 2009-07-19 20:01:08
如果你正在处理标准的C类型,它并不比在C中更常见或者说"OK“。这就是在C中是如何做的,这是Objective-C的一部分。
围绕这些东西编写某种类型的对象包装器以使其与Cocoa的其余部分(KVO、内存管理等)协调一致也是很常见的。因此,您可以创建一个在幕后执行malloc
的IntArray类,以便您可以根据需要保留和释放它。请注意,这并不是必须的-如果这种结构是程序的主要部分,那么它就会很方便。
https://stackoverflow.com/questions/1150650
复制相似问题