我致力于扑克牌课程的实施,我创造了以下方法:
+ (id)cardWithCard:(Card *)newCard
{
Card *card = [[[Card alloc] initWithCard:newCard] autorelease];
return card;
}
我在这里使用自动释放方法,否则产品 - >分析警告我潜在的泄漏。一切正常,直到变量myCard(之前已分配)为其赋予了新值,如下所示:myCard = [Card cardWithCard:newCard]
作为参数发送到不同的方法。结果是在那里解除分配,我的应用程序崩溃了。
我该如何解决这个问题?尽管有分析警告,否则自动释放方法?
答案 0 :(得分:2)
每个方法或对象都应该负责保留它感兴趣的对象
它更容易维护。 (例外情况是在名称中包含alloc
,new
或copy
的方法,它们将返回调用者负责release
的对象。)
因此您需要保留autorelease
,因为return
之后该方法不存在,并且无法在其上调用释放。
正在调用cardWithCard
的对象应该retain
该对象,如果它希望它更活跃于该特定方法的时间。
代码看起来应该是这样的
self.myCard = [Card cardWithCard:newCard];
这是myCard
声明如此
@property (nonatomic, retain) Card * myCard;
因此,在这种情况下,属性将为您执行保留,并在您将在此属性中放置新对象时释放该对象。 (如果覆盖自动生成的访问器,则需要自己使用这些方法进行管理)
如果由于某种原因你不想使用房产......那么这是你的选择:-)
你需要做这样的事情:
myCard = [[Card cardWithCard:newCard] retain];
以后你需要这样的事情
[myCard release];
如果它不是同一种方法,分析仪会编译,如果它采用相同的方法,你可能不需要retain
。