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)
Ada*_*eld 48
这完全没问题 - 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);
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上完全不切实际.我不确切知道开销是多少,但每个字符肯定不止一个字节.
当然,你可以使用这些函数,因为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数组对象使这更容易.
| 归档时间: |
|
| 查看次数: |
44709 次 |
| 最近记录: |