objective-c - 释放和自动释放有什么区别?

标签 objective-c memory-management autorelease

对于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/

相关文章:

ios - 从应用程序内部订阅日历

ios - 通过 Segue 传输核心数据 - Objective-C (Xcode)

cocoa - 具有 "copy"属性的 NSURL 属性。漏水了吗?

objective-c - 释放方法返回的对象

ios - 在 iOS 中用白色像素替换部分像素缓冲区

ios - 创建一个 NSString 的集合/数组以与 stringByReplacingOccurrencesOfString 一起使用

objective-c - 我可以创建自己的内存管理来处理 Cocoa 对象吗

c++ - 交换指针后删除动态分配的内存

ios - 圆弧错误 : cannot capture __autoreleasing variable in a block

objective-c - 在长时间运行的后台线程上定期耗尽自动释放池的最佳方法?