首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Objective-C/iPhone应用程序中使用“经典的”malloc()/free()可以吗?

在Objective-C/iPhone应用程序中使用“经典的”malloc()/free()可以吗?
EN

Stack Overflow用户
提问于 2009-07-19 19:22:10
回答 4查看 48.2K关注 0票数 56

我已经尝试过iPhone开发一段时间了,虽然当您是一个“铁杆”.NET开发人员时感觉有点笨拙,但是一旦您习惯了它,情况就不会那么糟糕了。

在我读到的每一本关于Objective-C的书中,都只谈到用于内存管理的retain/release (引用计数)。作为一个老派的C/C++开发人员,使用malloc()free()的“正常”分配方式只在一些脚注中提到,这似乎很奇怪。

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

代码语言:javascript
复制
int *array = malloc(sizeof(int) * 100);

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

// use the array

free(array);

这真的是最好的方法吗,或者我应该避免纯C语言的内存管理?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-07-20 13:04:57

在原始内存中有一个Objective-C包装器,我喜欢在类似的任务中经常使用它:NSMutableData。它的好处是让您保留/释放所有权,而且可以轻松地扩展阵列(无需您自己进行重新分配)。

您的代码将如下所示:

代码语言:javascript
复制
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)
票数 85
EN

Stack Overflow用户

发布于 2009-07-19 19:37:51

这是非常好的-- Objective-C是C的严格超集,所以如果您想编写纯C语言,没有什么可以阻止您这样做。在许多情况下,使用mallocfree可以避免Objective-C运行时的开销。

例如,如果您需要动态分配一个包含未知数量的整数的数组,则通常会更简单、更容易:

代码语言:javascript
复制
int *array = malloc(N * sizeof(int));  // check for NULL return value!
// use array[0]..array[N-1]
...
free(array);

对比:

代码语言:javascript
复制
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的开销是完全不切实际的。我不知道确切的开销是多少,但肯定是每个字符超过一个字节。

票数 48
EN

Stack Overflow用户

发布于 2009-07-19 20:01:08

如果你正在处理标准的C类型,它并不比在C中更常见或者说"OK“。这就是在C中是如何做的,这是Objective-C的一部分。

围绕这些东西编写某种类型的对象包装器以使其与Cocoa的其余部分(KVO、内存管理等)协调一致也是很常见的。因此,您可以创建一个在幕后执行malloc的IntArray类,以便您可以根据需要保留和释放它。请注意,这并不是必须的-如果这种结构是程序的主要部分,那么它就会很方便。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1150650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档