这是我目前的情况:
我有一个名为dictKeyArray的NSMutableArray,我为@property(nonatomic,retain)NSMutableArray *dictKeyArray
分配了一个属性
我在实现文件中合成了我的可变数组。
后来,我有一个字典名称storeDict。我将字典的所有键分配给dictKeyArray,如下所示:
dictKeyArray = [[storeDict allKeys] mutableCopy];
现在我稍后在我的实现文件中使用这个字典。但是,在发布它时,我会在dealloc
方法中释放它一次。使用仪器检查时,会出现泄漏!为什么dictKeyArray漏水了?我应该使用assign
代替retain
吗?
我还不清楚它们的区别是什么......
谢谢!
答案 0 :(得分:1)
你必须发送
[[[storeDict allKeys] mutableCopy] autorelease];
只是为了清楚说明:mutableCopy
与alloc
的作用相同,这意味着您声称对相关对象拥有所有权。您必须将retainCount减少一个。
顺便说一下:您应该使用您为其编写的访问器。您现在只是将它分配给您的iVar。如果你想让你的访问者工作,你将不得不使用像
这样的东西object.dictKeyArray = ...;
总的来说。或者在这里(如dreamlax所述)
self.dictKeyArray = ...;
因为您指的是代码所在的特定类的对象。
只有这样才能确保访问者正确保留您的对象。否则编写访问者代码根本没有意义,因为它永远不会被调用。
请注意:正如Josh在评论中所说,您的代码应该是有效的(至少从我的角度来看)。我建议的解决方案并不像您那样容易出错,因为您遵守规则(可以在不久的将来免除您的头痛)。
答案 1 :(得分:1)
您应该使用self.dictKeyArray = ...
。如果没有self.
,您将直接访问实例变量,绕过属性的任何内存管理优势,但是,请记住您拥有mutableCopy
的结果,并且分配给也拥有所有权的属性将导致双重所有权,所以使用:
self.dictKeyArray = [[[storeDict allKeys] mutableCopy] autorelease];