【问题标题】:Do I have a leak with this statement?我有这个声明的泄漏吗?
【发布时间】:2010-10-07 00:35:47
【问题描述】:

声明是:

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

我的属性设置为:

@property (nonatomic, retain) FoodFacility *theFoodFacilityCopy;

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

以上语句的正确写法是什么?

【问题讨论】:

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


    【解决方案1】:

    是的,那里确实有泄漏。

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

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

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

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

    【讨论】:

    • 如果你想让它保持单线,你也可以只自动释放。
    • 一般来说,我尽量避免自动释放,除非我真的需要它(比如从方法中返回一个对象)。当出现问题时,自动释放的对象可能会导致难以调试的问题,因为崩溃时的堆栈跟踪根本不会与您的代码相交。我以前也被这个咬过。
    • 感谢 Squeegy 我已经在我的程序中实现了这种方式。这也行吗? self.childController.theFoodFacilityCopy = [self.theFoodFacility 副本]; [self.childController.theFoodFacilityCopy 发布];这会将保留计数减少 1 吗?与否..
    • 是的,这会起作用,但我觉得它是非常非常糟糕的形式。释放你所拥有的就是咒语。您的代码会找到其他人拥有的对象并释放它。这只是一个坏主意,可能会在以后导致一些奇怪的调试。
    • Dan Morgan:这在这种情况下会起作用,但是如果您将FoodFacilityCopy 变成(复制)属性而不是(保留)属性,则会导致泄漏和 i> 提前发布。祝你好运!
    【解决方案2】:

    你是对的。最干净的方法是

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这也是一个很好的观点。如果这是您的常用操作,则制作属性使用副本是迄今为止最简单的方法。
      【解决方案4】:

      与仅将属性设置为复制相比,这样做有什么优势?

      @property (nonatomic, copy) FoodFacility *theFoodFacilityCopy;
      

      【讨论】:

      • 如果这始终是您分配对象的方式,那么您应该这样做,是的。但也许这是一个特例。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-14
      相关资源
      最近更新 更多