目标C:堆栈与堆的内存分配
我对在堆上分配什么东西(我需要释放它们)以及何时将它们分配到堆栈上(我不需要将它们分解)有些困惑。
有没有经验法则?
我认为在C ++中,经验法则是,如果你使用new
关键字,他们在堆上。 目标c的规则是什么? 我如何知道什么时候在堆栈上分配了某些东西?
这行代码是否被分配到堆栈上?
NSString *user = @"DEFAULT";
在Objective-C中,很容易:所有对象都分配在堆上。
规则是,如果你调用一个带有alloc
或new
的方法或者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