这句话我有泄漏吗?

时间:2009-02-11 20:45:43

标签: iphone objective-c cocoa-touch memory-management

陈述是:

//Pass the copy onto the child controller
self.childController.theFoodFacilityCopy = [self.theFoodFacility copy];

我的属性设置为:

@property (nonatomic, retain) FoodFacility *theFoodFacilityCopy;

我认为我有泄漏的原因是因为copy保留了值,然后我的点语法属性也保留了该值。双重保留。

撰写上述陈述的正确方法是什么?

4 个答案:

答案 0 :(得分:9)

是的,你确实有泄漏。

SomeClass *someObj = [self.theFoodFacility copy];
self.childController.theFoodFacilityCopy = someObj;
[someObj release];

这反映了推荐的初始化对象的方法:

SomeClass *someObj = [[SomeClass alloc] init];
self.someProperty = someObj;
[someObj release];

在这两种情况下,第一行都会返回一个保留计数为1的对象,之后你会对它进行相同的处理。

答案 1 :(得分:6)

正如其他人所说,这确实是一个漏洞。如果您希望以这种方式使用副本,则可能会将您的属性声明为副本,而合成访问者将为您完成工作。

答案 2 :(得分:0)

你是对的。最干净的方式就像

id temp = [self.theFoodFacitlity copy];
self.childController.theFoodFacilityCopy = temp;
[temp release]

你想要阅读apple site on memory management,直到这些规则成为第二天性。

答案 3 :(得分:0)

这样做有什么好处,只需将属性设置为复制?

@property (nonatomic, copy) FoodFacility *theFoodFacilityCopy;