【问题标题】:Retaining an autoreleased variable, where do I release it?保留一个自动释放的变量,我在哪里释放它?
【发布时间】:2011-12-14 00:07:31
【问题描述】:

我有一个 NSMutableArray 属性声明为(非原子,保留)称为类别。在 dealloc 中,我释放该变量的内存。最初,在 viewDidLoad 中,我分配了该数组并调用了另一个用虚拟数据填充该数据的方法。基本上

[categories addObject:someObject1];
[categories addObject:someObject2];
....

这很有效。

然后,我通过与模型对话并返回自动释放数组的方法从同事那里获得了真实数据。使用该方法后,我得到了 EXC_BAD_ACCESS。

categories = [datamanager GetCategories];

现在是因为我没有保留从 datamanager GetCategories 方法返回的自动释放数组吗?

如果是这样,我需要删除 viewDidLoad 中的 alloc/init,因为那会是内存泄漏,对吧?

谢谢,只是想确保我正确理解内存管理。

【问题讨论】:

    标签: iphone memory-management


    【解决方案1】:

    我认为你在正确的轨道上。如果您从返回 autoreleased 对象的方法中获取categories,那么您希望保留该对象。因此,您可以将上面的分配更改为以下任一项:

    // use the synthesized setter's retain
    self.categories = [datamanager GetCategories];
    
    // or explicitly retain the object (which clearly indicates the code's intention)
    categories = [[datamanager GetCategories] retain];
    

    viewDidLoad 中的 alloc/init 是不必要的。

    【讨论】:

    • 我想说最好的做法是使用self. 语法。你已经声明了一个 Obj-C 2.0 属性,你也可以使用它。
    • 同意 darvids0n,self.property = 总是比直接设置更可取,尤其是当您覆盖 setter 并且您不知道为什么它不起作用时!
    • 我同意self. 语法更可取。然而,对于学习 Obj-c 内存管理的人来说,了解这两个选项的工作原理很重要。
    • 也不要忘记按照原始问题“保留一个自动释放的变量,我在哪里释放它?”在 dealloc 中释放保留的类别变量
    猜你喜欢
    • 2012-10-10
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多