Iphone 我的这句话有漏洞吗?
声明如下:Iphone 我的这句话有漏洞吗?,iphone,objective-c,cocoa-touch,memory-management,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保留了该值,然后我的dot syntax属性也保留了该值。双重保留 写上述声明
//Pass the copy onto the child controller
self.childController.theFoodFacilityCopy = [self.theFoodFacility copy];
我的属性设置为:
@property (nonatomic, retain) FoodFacility *theFoodFacilityCopy;
我认为我有漏洞的原因是copy
保留了该值,然后我的dot syntax属性也保留了该值。双重保留
写上述声明的正确方法是什么?是的,你确实有漏洞
SomeClass *someObj = [self.theFoodFacility copy];
self.childController.theFoodFacilityCopy = someObj;
[someObj release];
这也反映了初始化对象的推荐方法:
SomeClass *someObj = [[SomeClass alloc] init];
self.someProperty = someObj;
[someObj release];
在这两种情况下,第一行都返回一个保留计数为1的对象,之后您将以相同的方式处理它。您是对的。最干净的方式是
id temp = [self.theFoodFacitlity copy];
self.childController.theFoodFacilityCopy = temp;
[temp release]
在这些规则成为第二天性之前,你需要大量阅读这些规则。正如其他人所提到的,这确实是一个漏洞。如果您希望以这种方式使用副本,则很可能您的属性应该声明为copy,而合成的访问器将为您完成这项工作。这样做与仅将属性设置为copy相比有什么好处
@property (nonatomic, copy) FoodFacility *theFoodFacilityCopy;
如果你想让它保持一行,你也可以直接自动释放。一般来说,我会尽量避免自动释放,除非我真的需要它(比如从一个方法返回一个对象)。当出现问题时,自动释放对象可能会导致难以调试的问题,因为崩溃时的堆栈跟踪根本不会与代码相交。我以前也被这个问题困扰过。谢谢Squegy,我已经在我的程序中实现了这种方法。这也可以吗?self.childController.theFoodFacility复制=[self.theFoodFacility复制];[self.childController.theFoodFacilityCopy发布];这会使保留计数减少1吗?或者不……是的,那会管用,但我觉得这是非常糟糕的形式。释放你所拥有的是咒语。您的代码找到其他对象拥有的对象并将其释放。Dan Morgan:在这种情况下,这可能会起作用,但如果您将FoodFacilityCopy关闭为(复制)属性而不是(保留)属性,则会导致泄漏并提前发布。祝你好运修好那个!这也是一个很好的观点。如果这是一个常见的操作,那么让属性使用副本是迄今为止最简单的方法。如果您总是这样分配对象,那么您应该这样做,是的。但也许这是个特例。