我对释放和自动释放仍然有一些不清楚的理解.它们之间有什么区别?我有这个代码.对于Facebook连接.当我去Facebook登录时有时会崩溃,我怀疑是因为我不能很好地发布这个对象.谢谢你的帮助
if (_session.isConnected) { [_session logout]; } else { FBLoginDialog* dialog = [[[FBLoginDialog alloc] initWithSession:_session] autorelease]; [dialog show]; }
Barry Wark.. 22
Cocoa的内存管理编程指南很快就会成为你最好的朋友.简而言之,Cocoa中的对象实例是使用引用计数进行内存管理的(当然,除非你在OS X上使用垃圾收集).对象表示它希望通过向其发送-retain
消息来"保留"其他实例中的所有者权益 - 防止其被解除分配.对象表示它希望通过向另一个实例发送-release
消息来释放该兴趣.如果对象中具有"保留"和所有者权益的对象数量降至0(即,当最后一个拥有实例发送-release
消息时),则取消分配具有0保留计数的实例.
有时候说"我希望将来某个时候释放这个实例"很方便.这就是目的-autorelease
.发送-autorelease
消息会将接收器添加到当前NSAutoreleasePool
.当该池耗尽时,它会向-release
池中的所有实例发送一条消息.一个NSAutoreleasePool
在每个线程的run每次循环的启动时自动生成并排出在那个迭代结束.因此,您可以在方法中执行以下操作:
- (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 }
user4951.. 9
释放意味着您立即释放它.自动释放意味着您希望在下一个自动释放池中释放该变量.
如果要保留变量但不想创建内存泄漏,则使用autorelease.当您不再需要变量时使用release.
样品:
- (NSNumber *)return5 { NSNumber * result = [[NSNumber alloc]initWitnInt: 5]; [result autorelease]; return result; }
为什么我们在那里使用自动释放?
如果我们改为使用[result release],那么变量结果将被破坏.这意味着返回的值将是垃圾.
如果我们根本不释放,变量result
将保持FOREVER导致内存泄漏.
我们可以告诉每个调用者该函数释放结果,但这将是一个令人头疼的问题并容易出错.
所以我们使用autorelease.我们将变量标记为在下一个自动释放池中释放.基本上我们标记要在alloc附近释放的变量.因此,mantra alloc与同一函数中的release一起保持.
实际上,您可以将所有版本更改为自动释放.您的记忆使用效率不高,但影响很小.所有编程语言中的所有变量都是有效自动释放的.
无论如何,使用ARC.
Cocoa的内存管理编程指南很快就会成为你最好的朋友.简而言之,Cocoa中的对象实例是使用引用计数进行内存管理的(当然,除非你在OS X上使用垃圾收集).对象表示它希望通过向其发送-retain
消息来"保留"其他实例中的所有者权益 - 防止其被解除分配.对象表示它希望通过向另一个实例发送-release
消息来释放该兴趣.如果对象中具有"保留"和所有者权益的对象数量降至0(即,当最后一个拥有实例发送-release
消息时),则取消分配具有0保留计数的实例.
有时候说"我希望将来某个时候释放这个实例"很方便.这就是目的-autorelease
.发送-autorelease
消息会将接收器添加到当前NSAutoreleasePool
.当该池耗尽时,它会向-release
池中的所有实例发送一条消息.一个NSAutoreleasePool
在每个线程的run每次循环的启动时自动生成并排出在那个迭代结束.因此,您可以在方法中执行以下操作:
- (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 }
释放意味着您立即释放它.自动释放意味着您希望在下一个自动释放池中释放该变量.
如果要保留变量但不想创建内存泄漏,则使用autorelease.当您不再需要变量时使用release.
样品:
- (NSNumber *)return5 { NSNumber * result = [[NSNumber alloc]initWitnInt: 5]; [result autorelease]; return result; }
为什么我们在那里使用自动释放?
如果我们改为使用[result release],那么变量结果将被破坏.这意味着返回的值将是垃圾.
如果我们根本不释放,变量result
将保持FOREVER导致内存泄漏.
我们可以告诉每个调用者该函数释放结果,但这将是一个令人头疼的问题并容易出错.
所以我们使用autorelease.我们将变量标记为在下一个自动释放池中释放.基本上我们标记要在alloc附近释放的变量.因此,mantra alloc与同一函数中的release一起保持.
实际上,您可以将所有版本更改为自动释放.您的记忆使用效率不高,但影响很小.所有编程语言中的所有变量都是有效自动释放的.
无论如何,使用ARC.