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。问题是普通对象不存在于堆栈上。