Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标C:堆栈与堆上的内存分配_Objective C_Memory Management - Fatal编程技术网

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

Objective c 目标C:堆栈与堆上的内存分配,objective-c,memory-management,Objective C,Memory Management,我对什么时候在堆上分配东西(我需要释放它们)以及什么时候在堆栈上分配东西(我不需要释放它们)感到有些困惑 有经验法则吗 我认为C++中的经验法则是,如果使用新< /Cord>关键字,它们就在堆上。目标c的规则是什么?如何判断堆栈上何时分配了某些内容 这行代码会在堆栈上分配吗 NSString *user = @"DEFAULT"; 在Objective-C中,这很简单:所有对象都在堆上分配 规则是,如果您在名称中使用alloc或new或copy调用方法(或调用retain),则您拥有该对象,并

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

有经验法则吗

我认为C++中的经验法则是,如果使用<代码>新< /Cord>关键字,它们就在堆上。目标c的规则是什么?如何判断堆栈上何时分配了某些内容

这行代码会在堆栈上分配吗

NSString *user = @"DEFAULT";

在Objective-C中,这很简单:所有对象都在堆上分配

规则是,如果您在名称中使用
alloc
new
copy
调用方法(或调用
retain
),则您拥有该对象,并且必须在稍后使用完该对象时释放它。关于这个问题已经有很多文章了


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

Objective-C中没有对象的堆栈分配(块是另一种情况,我不在这里讨论)


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

Objective-C在这方面很容易

所有Objective-C对象始终在堆上分配。 或者,至少应该将它们视为在堆上

用于:

字符串对象在技术上不在堆中,但也可能在堆中。也就是说,它是由编译器生成的,是应用程序二进制文件的一部分。它不需要保留和释放,因为类(
NSCFConstantString
,IIRC)重写了retain/release/autorelease,实际上什么也不做

至于何时释放和不释放对象,您应该读取(并重新读取)对象

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

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

我认为
retain
也应该在列表中。默认情况下,块是在堆栈上分配的。实际上,没有“常量内存”这样的东西,尽管它是一个精确的描述。它实际上是mmap的只读内存,来源于磁盘上的mach-o文件(或dyld共享缓存)。我指的是嵌入二进制文件中的静态内存。错误提示:)Upvoting由于blocks异常,当您希望在声明块的作用域被销毁后使用该块时,您应该制作一份副本。复制会将块移动到堆中。
NSString *user = @"DEFAULT";
NSString *user = @"DEFAULT";