如何管理自动释放对象的内存

时间:2011-12-13 14:55:44

标签: objective-c memory-management autorelease

我致力于扑克牌课程的实施,我创造了以下方法:

+ (id)cardWithCard:(Card *)newCard
{
Card *card = [[[Card alloc] initWithCard:newCard] autorelease];
return card;
}

我在这里使用自动释放方法,否则产品 - >分析警告我潜在的泄漏。一切正常,直到变量myCard(之前已分配)为其赋予了新值,如下所示:myCard = [Card cardWithCard:newCard]作为参数发送到不同的方法。结果是在那里解除分配,我的应用程序崩溃了。 我该如何解决这个问题?尽管有分析警告,否则自动释放方法?

1 个答案:

答案 0 :(得分:2)

每个方法或对象都应该负责保留它感兴趣的对象 它更容易维护。 (例外情况是在名称中包含allocnewcopy的方法,它们将返回调用者负责release的对象。)

因此您需要保留autorelease,因为return之后该方法不存在,并且无法在其上调用释放。
正在调用cardWithCard的对象应该retain该对象,如果它希望它更活跃于该特定方法的时间。

代码看起来应该是这样的

self.myCard = [Card cardWithCard:newCard];

这是myCard声明如此

的情况
@property (nonatomic, retain) Card * myCard;

因此,在这种情况下,属性将为您执行保留,并在您将在此属性中放置新对象时释放该对象。 (如果覆盖自动生成的访问器,则需要自己使用这些方法进行管理)

如果由于某种原因你不想使用房产......那么这是你的选择:-)
你需要做这样的事情:

myCard = [[Card cardWithCard:newCard] retain];

以后你需要这样的事情

[myCard release];

如果它不是同一种方法,分析仪会编译,如果它采用相同的方法,你可能不需要retain