Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 我的这句话有漏洞吗?_Iphone_Objective C_Cocoa Touch_Memory Management - Fatal编程技术网

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关闭为(复制)属性而不是(保留)属性,则会导致泄漏并提前发布。祝你好运修好那个!这也是一个很好的观点。如果这是一个常见的操作,那么让属性使用副本是迄今为止最简单的方法。如果您总是这样分配对象,那么您应该这样做,是的。但也许这是个特例。