gpt4 book ai didi

objective-c - Cocoa 示例 - 为什么不需要保留或释放消息

转载 作者:行者123 更新时间:2023-12-03 16:54:31 25 4
gpt4 key购买 nike

我是 Objective-C 和 cocoa 的新手。在 guide Apple为Cocoa提供的,在内存管理中有一个令人困惑的例子:

Suppose you want to implement a method to reset the counter. You have a couple of choices. The first implementation creates the NSNumber instance with alloc, so you balance that with a release.

- (void)reset {
NSNumber *zero = [[NSNumber alloc] initWithInteger:0];
[self setCount:zero];
[zero release];
}

The second uses a convenience constructor to create a new NSNumber object. There is therefore no need for retain or release messages

- (void)reset {
NSNumber *zero = [NSNumber numberWithInteger:0];
[self setCount:zero];
}

我不确定为什么使用“new”而不是“alloc & init”创建的对象不需要保留/释放。我的理解是,两者都在做同样的事情,除了通过“alloc & init”我们可以使用自定义检查和初始化。

非常感谢。

最佳答案

第二个示例返回一个自动释放的对象。便捷构造函数的代码可能如下所示,至少在复制功能时是这样。

+ (NSNumber *)numberWithInteger:(NSInteger)integer
{
NSNumber *number = [[NSNumber alloc] initWithInteger:integer];
return [number autorelease];
}

自动释放是一种推迟向对象发送释放方法而不将对象的所有权委托(delegate)给构造函数的调用者的方法。这是一个重要的概念,因为命名约定要求您不要返回对象的所有权,除非您的方法以 copy new alloc保留。但是,由于您无法返回拥有的对象,因此您必须在便捷构造函数中对其调用 release ,这将导致您返回已释放的对象。因此,自动释放允许您向调用者返回一个无主对象,该调用者稍后将收到实际的释放方法(当当前自动释放池耗尽时)。

自动释放方法被收集在所谓的自动释放池中,自动释放池是线程本地准链表(它们不是作为链表实现的,但它们确实像以前一样工作)并且只收集自动释放的对象。可以通过调用将对象多次添加到其中,对于它们收到的每个 autorelease 方法调用一次。当池被耗尽或销毁时,它包含的所有对象都将收到release消息。默认情况下,系统会为您提供一个自动释放池,至少在主线程上,但您可以使用以下代码创建自己的释放池(如果您看一下,它也用于每个主方法中):

@autoreleaspool
{
[foo autorelease]; // foo will receive a `release` method at the closing brace
}

关于objective-c - Cocoa 示例 - 为什么不需要保留或释放消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20824735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com