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:]:无法识别的选择器发送到实例