什么时候应该使用retain
?我知道它增加了对象引用计数,所以基本上该对象上的下一个release
将不会在其上调用dealloc
。好的,那又怎样?我读到这是一种惯例,如果你关心一个物体,你retain
它。那里有什么例子吗?这是真的吗?
修改
我不是在寻找调试器告诉你这样做的时候。所以,我调查了this。
用我的话来说,这是一个retain
用法
copy
或retain
。如果您使用retain
,那么您将获得该对象的所有权。release
(因为保留时引用计数为1 + 1)或直接使用dealloc
dealloc
将真正“杀死”该对象;但是使用2 release
,你不会是所有者,但是创建它的程序仍然是,因此对象在某个地方仍然存在(泄漏?僵尸?)
我很困惑。
答案 0 :(得分:6)
您的所有答案都可以在Memory Management Guide。
中找到修改强>
在您编辑之后,这里有一些更具体的细节:
在你的代码中,你在某个地方调用一个方法,该方法返回一个你不拥有的对象
因为你不拥有它,所以你无法控制它的生命周期。它可以在您仍然依赖它作为有效对象时释放。
您使用该对象
永远不要确定它会存在。
然后你要释放它=>你不能,因为你不是主人
但你为什么要发布呢?您不拥有该对象,因此您不对其内存管理负责。
看起来好像要调用release
,因为您认为这是您管理内存的方式,retain
就是让您称呼它。
以下是它的工作方式:
alloc
,new
,copy
或mutableCopy
收到此对象,那么根据您不拥有该对象的Memory Management Guide,所以你不负责管理这段记忆。retain
。您现在拥有此对象,并负责在将来的某个时间调用release
。现在关注对象的保留计数是一个初学者的错误。不要。重要的是,您有责任在其上致电release
。NSArray
,则数组将保留该对象。release
。再次。不要关心对象的保留计数,或者使用此对象的其他对象。重要的是,您通过拨打retain
的同等数量来调整release
的来电。答案 1 :(得分:1)
我通常只在需要时显式使用retain,并且Xcode调试器告诉我在出现这种情况时刚刚发生了什么。通常无论出于何种原因(开发人员管理不善或幕后发布了一些版本),您对已发布的对象执行任何操作,都会导致崩溃。只需阅读控制台上的日志,在调试时查看Xcode上的调试器,你通常会找出导致问题的对象。
答案 2 :(得分:0)
Marcel,内存管理是开发iOS应用程序的关键点。 您应该考虑按照其他人的建议阅读有关它的Apple文档。
我可以在这里添加一些信息,以帮助您满足您的需求。
使用Obj-C的内存管理过程是计数基础。这意味着只要您“保留”某个对象,系统就会改进此对象的计数器。例如,如果您创建一个按钮并“保留”它,它将具有值1.如果再次保留它,它将具有值2.要完全销毁此对象,您需要将其释放两次。 只要对象的值为0,它就会被销毁。
我的个人观点:如果您希望对应用程序的内存管理有一个很好的控制,最好明确保留和销毁您的对象,尽可能避免自动释放。再次,这是我的个人意见。我想知道我的应用程序内部的内存过程,这就是为什么我更愿意精确地处理这个问题。
当然,这不是最佳方式,每个开发人员都倾向于使用不同的方法来管理内存。
再次:花些时间阅读Abizem建议你的文档。当然你会对它有更好的了解。
答案 3 :(得分:-1)
检查Objective-C beginners guide的基本用法