【问题标题】:copyWithZone return value ownership and retain countcopyWithZone 返回值所有权和保留计数
【发布时间】:2011-06-05 17:38:53
【问题描述】:

我在苹果文档中阅读了有关 copyWithZone 的内容:

“返回的对象隐式由发送者保留,发送者负责释放它”。

所以如果我写这个:

 - (id)copyWithZone:(NSZone *)zone {
        MyObject* obj = [[[[self class] allocWithZone:zone] init] autorelease];
        [obj fillTheObj];

        return obj;
    }

我打电话给:

MyStuff* obj = [varobj copy];

obj 会被保留吗?如果我不设置自动释放,那么保留计数呢?

【问题讨论】:

    标签: iphone autorelease retaincount copywithzone


    【解决方案1】:

    不要在您的 copyWithZone 方法中自动释放它,否则您将不会拥有它(甚至可能无法对它做任何事情)。

    删除自动释放,obj 将适当地保留在 MyStuff 复制中。完成后只需 release 即可。

    Apple 语句是说发送者——也就是你的MyStuff *obj 初始化——拥有所有权并且需要释放它。 “发件人”是指发送copy 消息的对象,而不是您的copyWithZone 方法。

    【讨论】:

    • @Matthew Frederick :好的,所以苹果文档说没有隐式保留。由于您的代码,这是一个明确的?
    • 阅读我编辑的版本。因为发送者正在执行复制,所以它现在隐式地保留它。这对我来说非常明确,但是“保留”这个词在任何地方都没有使用,所以它是隐含的。
    • @Matthew Frederick:好的,那如果我删除自动释放呢?调用内部有一个保留,调用外部有一个隐式保留,不是吗?换句话说,这里的隐含是什么?我只看到明确的东西,否则会有两个保留。
    • 删除自动释放并在完成后释放对象。 copyWithZone 方法中的 allocWithZone 和 init 是保留的内容,它被传递给您的调用者。这就是所有copy 请求所发生的情况:保留发生在复制方法中,所有权被传递给消息发送者。隐含的部分是尽管没有使用“alloc”或“retain”这个词,但发送者被赋予了所有权。
    • 没有魔法发生。它会做任何你实现的事情。只是分配的对象已经被保留了。
    猜你喜欢
    • 1970-01-01
    • 2013-11-16
    • 2011-04-02
    • 1970-01-01
    • 2022-01-20
    • 2018-05-13
    • 2011-02-19
    • 1970-01-01
    相关资源
    最近更新 更多