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

在我读过的每一本关于Objective-C的书中,都只提到了内存管理的retain/release(参考计数).作为一名老的skool C/C++开发人员,使用malloc()free()分配"正常"方式似乎很奇怪,只是在一些脚注中提到了这一点.

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

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

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

// use the array

free(array);

这真的是最好的方法吗?还是应该避免普通的C内存管理?

推荐答案

原始内存有一个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)

C++相关问答推荐

设计处理各种数据类型的方法和数据 struct

C strlen on char array

以c格式打印时间戳

ATTiny1606定时器TCA 0中断未触发

我编译了一个新的c程序,并收到以下错误

为什么输出不是从上到下C

我可以在C中声明不同长度数组的数组而不带变量名吗?

Ruby C Api处理异常

为什么GDB/MI进程的FIFO循环中有read()阻塞

加密解密工作正常,但返回错误0x80090005

如何确保在C程序中将包含uft8字符的字符串正确写入MySQL?

Caesar密码调试:输出文本末尾的问号和随机字符

有没有一种方法可以用C创建保留限定符的函数?

为什么我无法访问C语言中的文件

从整型转换为浮点型可能会改变其值.

发送和接收的消息中的Unix域套接字不匹配

将char*数组深度复制到 struct 中?

中位数和众数不正确

传递参数:C 和 C++ 中 array 与 *&array 和 &array[0] 的区别

如何正确探测平台设备?