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