目标C:堆栈与堆上的内存分配

时间:2010-12-01 17:10:07

标签: objective-c memory-management

我有点困惑的事情是什么时候在堆上分配(我需要释放它们)以及何时将它们分配到堆栈上(我不需要释放它们)。

有经验法则吗?

我认为在C ++中,经验法则是如果你使用new关键字,它们就在堆上。客观c的规则是什么?如何判断何时在堆栈上分配了什么?

这行代码是否会在堆栈上分配?

NSString *user = @"DEFAULT";

4 个答案:

答案 0 :(得分:37)

Objective-C在这方面很容易。

所有Objective-C对象始终在堆上分配。

或者,至少,应该被视为好像在堆上。

有关:

NSString *user = @"DEFAULT";

字符串对象在技术上不在堆中,但也可能是。也就是说,它由编译器生成,是应用程序二进制文件的一部分。它不需要保留和释放,因为类(NSCFConstantString,IIRC)会覆盖retain / release / autorelease以有效地执行任何操作。

至于何时发布和不发布对象,您应该阅读(并重新阅读)Objective-C memory management guide

(还有一个例外,但它是一个相当深奥的细节;块从堆栈开始,你可以将它们阻塞到堆中。块也恰好是Objective-C对象,但很少暴露在使用。)

答案 1 :(得分:34)

在Objective-C中,很容易:所有对象都在堆上分配。

规则是,如果您在名称中调用allocnewcopy的方法(或者您致电retain),则您拥有该对象,并且你必须在完成它之后的某个时候释放它。有很多关于这个主题的文章。

您给出的示例是一个特例:这是一个静态字符串,我相信它实际上位于程序的数据段(在堆上),但它是静态的,所以您不必担心释放它。 / p>

答案 2 :(得分:1)

Objective-C中没有对象的堆栈分配(块是不同的情况,我不打算进入这里)

NSString *user = @"DEFAULT";

在常量内存中分配NSConstantString对象,而不是在堆栈上。

答案 3 :(得分:0)

在Objective-C(以及许多其他语言)中,对象只是一个具有特定布局的连续内存块。通常在堆上创建对象。对象指针变量本身的存储位于堆栈中 但它指向的对象是在堆中。