iPhone:copyWithZone:在返回之前释放一个对象?

Posted

技术标签:

【中文标题】iPhone:copyWithZone:在返回之前释放一个对象?【英文标题】:iPhone : copyWithZone : releasing an object before its return? 【发布时间】: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
    

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

【问题讨论】:

【参考方案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

以上是关于iPhone:copyWithZone:在返回之前释放一个对象?的主要内容,如果未能解决你的问题,请参考以下文章

NSInvalidArgumentException/copyWithZone 异常与 NSMutableDictionary

如何使用 copyWithZone 进行深层复制以复制结构?

错误:静态成员 copyWithZone 不能用于 UIImageView 类型的实例

[UILabel copyWithZone:]:无法识别的选择器发送到实例

[__NSCFTimer copyWithZone:]:无法识别的选择器发送到实例

cocoa -[Person copyWithZone:]: 无法识别的选择器发送到实例