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 如果向基于堆栈的对象发送保留消息,是否未将其复制到堆?_Objective C_Memory Management_Copy_Objective C Blocks_Retain - Fatal编程技术网

Objective c 如果向基于堆栈的对象发送保留消息,是否未将其复制到堆?

Objective c 如果向基于堆栈的对象发送保留消息,是否未将其复制到堆?,objective-c,memory-management,copy,objective-c-blocks,retain,Objective C,Memory Management,Copy,Objective C Blocks,Retain,如果向基于堆栈的对象发送retain消息,则不会将其复制到堆中;只有在收到copy消息后才会复制它。请解释。大多数对象都是在堆上分配的,它们的生存期由它们获得的保留和释放数量决定。但是块是一种特殊的对象,通常在堆栈上分配。这意味着当堆栈帧弹出时(例如,当函数返回时),块的内存将被覆盖。发送基于堆栈的块retain不会将其转换为基于堆的对象,因此即使您保留它,它仍然会被覆盖。将块保持在函数末尾附近的唯一方法是复制它,这会将副本放在堆上。这只适用于块,而不是所有的“对象”。你不明白哪一部分?@new

如果向基于堆栈的对象发送
retain
消息,则不会将其复制到堆中;只有在收到
copy
消息后才会复制它。请解释。

大多数对象都是在堆上分配的,它们的生存期由它们获得的保留和释放数量决定。但是块是一种特殊的对象,通常在堆栈上分配。这意味着当堆栈帧弹出时(例如,当函数返回时),块的内存将被覆盖。发送基于堆栈的块
retain
不会将其转换为基于堆的对象,因此即使您保留它,它仍然会被覆盖。将块保持在函数末尾附近的唯一方法是
复制它,这会将副本放在堆上。

这只适用于块,而不是所有的“对象”。你不明白哪一部分?@newacct,意思是retain的作用是什么,这样它就不会复制到堆中?“所以即使你保留它,它仍然会被覆盖。”它不会,或者我会在这里混淆?@Sandy:一旦堆栈帧弹出,堆栈帧中的任何内容都会被覆盖,不管你是否发送了retain。问题是普通对象不存在于堆栈上。