对于release和autorelease,我还是有些不明白。它们之间有什么区别?我有这个代码。对于 facebook 连接。当我去 Facebook 登录时有时会崩溃,我怀疑这可能是因为我没有很好地释放对象。?感谢您的帮助
if (_session.isConnected) {
[_session logout];
} else {
FBLoginDialog* dialog = [[[FBLoginDialog alloc] initWithSession:_session] autorelease];
[dialog show];
}
最佳答案
Memory Management Programming Guide for Cocoa很快就会成为你最好的 friend 。简而言之,Cocoa 中的对象实例是使用引用计数进行内存管理的(当然,除非您在 OS X 上使用垃圾回收)。一个对象表明它想“保留”对另一个实例的所有权权益——防止它被释放——通过向它发送 -retain
消息。一个对象通过向另一个实例发送 -release
消息来表示它想要释放该兴趣。如果“保留”对象的数量和对象的所有权权益下降到 0(即,当最后一个拥有实例发送 -release
消息时),保留计数为 0 的实例是释放。
有时说“我希望这个实例在将来的某个时间发布”会很方便。这就是 -autorelease
的目的。发送 -autorelease
消息将接收者添加到当前 NSAutoreleasePool
。当该池被耗尽时,它会向池中的所有实例发送一条 -release
消息。 NSAutoreleasePool
在每个线程的运行循环的每次迭代开始时自动创建,并在该迭代结束时排出。因此,你可以在一个方法中做这样的事情:
- (id)myMethod {
return [[[MyObject alloc] init] autorelease];
}
此方法的调用者将取回一个实例,如果他们希望保留该实例,他们可以-retain
。如果他们不保留它,它至少会一直存在,直到封闭的自动释放池被排空:
- (void)someOtherMethod {
...
id instance = [obj myMethod];
... // do more with instance, knowing that it won't be dealloc'd until after someOtherMethod returns
}
关于objective-c - 释放和自动释放有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2076402/