我有点困惑的事情是什么时候在堆上分配(我需要释放它们)以及何时将它们分配到堆栈上(我不需要释放它们)。
有经验法则吗?
我认为在C ++中,经验法则是如果你使用new
关键字,它们就在堆上。客观c的规则是什么?如何判断何时在堆栈上分配了什么?
这行代码是否会在堆栈上分配?
NSString *user = @"DEFAULT";
答案 0 :(得分:37)
Objective-C在这方面很容易。
或者,至少,应该被视为好像在堆上。
有关:
NSString *user = @"DEFAULT";
字符串对象在技术上不在堆中,但也可能是。也就是说,它由编译器生成,是应用程序二进制文件的一部分。它不需要保留和释放,因为类(NSCFConstantString
,IIRC)会覆盖retain / release / autorelease以有效地执行任何操作。
至于何时发布和不发布对象,您应该阅读(并重新阅读)Objective-C memory management guide。
(还有一个例外,但它是一个相当深奥的细节;块从堆栈开始,你可以将它们阻塞到堆中。块也恰好是Objective-C对象,但很少暴露在使用。)
答案 1 :(得分:34)
在Objective-C中,很容易:所有对象都在堆上分配。
规则是,如果您在名称中调用alloc
或new
或copy
的方法(或者您致电retain
),则您拥有该对象,并且你必须在完成它之后的某个时候释放它。有很多关于这个主题的文章。
您给出的示例是一个特例:这是一个静态字符串,我相信它实际上位于程序的数据段(在堆上),但它是静态的,所以您不必担心释放它。 / p>
答案 2 :(得分:1)
Objective-C中没有对象的堆栈分配(块是不同的情况,我不打算进入这里)
NSString *user = @"DEFAULT";
在常量内存中分配NSConstantString对象,而不是在堆栈上。
答案 3 :(得分:0)
在Objective-C(以及许多其他语言)中,对象只是一个具有特定布局的连续内存块。通常在堆上创建对象。对象指针变量本身的存储位于堆栈中 但它指向的对象是在堆中。