【问题标题】:iPhone : copyWithZone : releasing an object before its return?iPhone:copyWithZone:在返回之前释放一个对象?
【发布时间】:2011-01-08 01:27:23
【问题描述】:

我在苹果文档中读到了 copyWithZone :“返回的对象由负责释放它的发件人隐式保留”。 但是...我要如何释放我返回的东西...我要疯了!

代码示例:

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

        return obj; // implicit retain
    }

通知发布应该在哪里? 我保留两次?呃……

【问题讨论】:

    标签: iphone release return retain copywithzone


    【解决方案1】:

    发件人负责放行。这意味着任何调用您的复制方法的人都会获得所有权,即:

    MyObject *obj = ...
    MyObject *aCopy = [obj copy];
    ... do stuff with aCopy
    [aCopy release];
    

    【讨论】:

    • Okkkk,调用的发送者,而不是对象的发送者。这更清楚。但我真的要疯了。所以...我可以通过 myObject.var = [localvar copy] 将 myObject 中的属性定义为保留,并在 dealloc 中释放。那会很好,不是吗?
    • @Oliver -- 如果你这样做,你会过度保留。如果var 属性被声明为retain,那么正确的赋值应该是myObject.var = [[localvar copy] autorelease]。但听起来你真正想要的是将属性声明为copy,然后你可以简单地做myObject.var = localvar
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 2011-03-16
    相关资源
    最近更新 更多