我有些困惑,不知道什么时候需要在堆上分配内存(需要释放),什么时候在栈上分配内存(不需要释放)。是否有经验法则?
我认为在C++中,经验法则是如果你使用new
关键字,则它们在堆上。在Objective-C中的规则是什么?我如何知道某个东西是在堆上分配的?
这行代码会在栈上分配吗?
NSString *user = @"DEFAULT";
我有些困惑,不知道什么时候需要在堆上分配内存(需要释放),什么时候在栈上分配内存(不需要释放)。是否有经验法则?
我认为在C++中,经验法则是如果你使用new
关键字,则它们在堆上。在Objective-C中的规则是什么?我如何知道某个东西是在堆上分配的?
这行代码会在栈上分配吗?
NSString *user = @"DEFAULT";
在这方面,Objective-C非常容易。
或者至少应该被视为在堆上。
因为:
NSString *user = @"DEFAULT";
字符串对象并非严格在堆中,但实际上可以看作在堆中。也就是说,它由编译器生成,并成为应用程序二进制文件的一部分。它不需要保留和释放,因为该类(NSCFConstantString
,如果我没记错)重写了retain/release/autorelease方法,以实际上什么都不做。
至于何时需要释放对象和不需要释放对象,你应该阅读(反复阅读)Objective-C内存管理指南。
(还有一个例外,但这是一个相当晦涩的细节;块始于堆栈,您可以将它们Block_copy()到堆中。块也恰好是Objective-C对象,但在使用中很少暴露出来。)
在 Objective-C 中,一切对象都容易地分配在堆上。
规则是,如果您调用具有alloc
、new
或copy
名称的方法(或者您调用了retain
),则您拥有该对象,并且您必须在以后某个时候释放它,当您用完它时。这方面已经有很多文章写过。
您给出的示例是一个特殊情况:那是一个静态字符串,我相信它实际上位于程序的数据段(堆)中,但它是静态的,所以您不需要担心释放它。
Objective-C 中没有对象的堆栈分配(块是另一种情况,我不会在这里讨论)
NSString *user = @"DEFAULT";
这会在常量内存中分配一个NSConstantString对象,而不是在堆栈上。