当前位置:  开发笔记 > 编程语言 > 正文

释放和自动释放有什么区别?

如何解决《释放和自动释放有什么区别?》经验,为你挑选了2个好方法。

我对释放和自动释放仍然有一些不清楚的理解.它们之间有什么区别?我有这个代码.对于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.



1> Barry Wark..:

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

}



2> user4951..:

释放意味着您立即释放它.自动释放意味着您希望在下一个自动释放池中释放该变量.

如果要保留变量但不想创建内存泄漏,则使用autorelease.当您不再需要变量时使用release.

样品:

- (NSNumber *)return5 {
    NSNumber * result = [[NSNumber alloc]initWitnInt: 5];
    [result autorelease];
    return result;
}

为什么我们在那里使用自动释放?

如果我们改为使用[result release],那么变量结果将被破坏.这意味着返回的值将是垃圾.

如果我们根本不释放,变量result将保持FOREVER导致内存泄漏.

我们可以告诉每个调用者该函数释放结果,但这将是一个令人头疼的问题并容易出错.

所以我们使用autorelease.我们将变量标记为在下一个自动释放池中释放.基本上我们标记要在alloc附近释放的变量.因此,mantra alloc与同一函数中的release一起保持.

实际上,您可以将所有版本更改为自动释放.您的记忆使用效率不高,但影响很小.所有编程语言中的所有变量都是有效自动释放的.

无论如何,使用ARC.

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有