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

我对在堆上分配什么东西(我需要释放它们)以及何时将它们分配到堆栈上(我不需要将它们分解)有些困惑。

有没有经验法则?

我认为在C ++中,经验法则是,如果你使用new关键字,他们在堆上。 目标c的规则是什么? 我如何知道什么时候在堆栈上分配了某些东西?

这行代码是否被分配到堆栈上?

NSString *user = @"DEFAULT";

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

规则是,如果你调用一个带有allocnew的方法或者copy名字(或者你调用retain ),你拥有这个对象,并且你必须在稍后完成它的时候释放它。 关于这个问题已经写了很多。

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


Objective-C在这方面很容易。

所有Objective-C对象总是在堆上分配。

或者,至少应该像对待堆一样对待。

对于:

NSString *user = @"DEFAULT";

字符串对象在技术上并不在堆中,但也可能是。 也就是说,它由编译器生成,并且是应用程序二进制文件的一部分。 它不需要保留和释放,因为类( NSCFConstantString ,IIRC)覆盖保留/释放/自动释放,从而无效。

至于何时释放对象,您应该阅读(并重新读取)Objective-C内存管理指南。

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


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

NSString *user = @"DEFAULT";

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

链接地址: http://www.djcxy.com/p/79191.html

上一篇: Objective C: Memory Allocation on stack vs. heap

下一篇: Visual Studio: find all references of a specific type