分配或保留在cocos2d和目标C中

时间:2012-06-13 18:46:56

标签: objective-c ios memory-management cocos2d-iphone

这是我目前的情况: 我有一个名为dictKeyArray的NSMutableArray,我为@property(nonatomic,retain)NSMutableArray *dictKeyArray分配了一个属性 我在实现文件中合成了我的可变数组。
后来,我有一个字典名称storeDict。我将字典的所有键分配给dictKeyArray,如下所示:
dictKeyArray = [[storeDict allKeys] mutableCopy];
现在我稍后在我的实现文件中使用这个字典。但是,在发布它时,我会在dealloc方法中释放它一次。使用仪器检查时,会出现泄漏!为什么dictKeyArray漏水了?我应该使用assign代替retain吗? 我还不清楚它们的区别是什么...... 谢谢!

2 个答案:

答案 0 :(得分:1)

你必须发送

[[[storeDict allKeys] mutableCopy] autorelease];

只是为了清楚说明:mutableCopyalloc的作用相同,这意味着您声称对相关对象拥有所有权。您必须将retainCount减少一个。

顺便说一下:您应该使用您为其编写的访问器。您现在只是将它分配给您的iVar。如果你想让你的访问者工作,你将不得不使用像

这样的东西
object.dictKeyArray = ...;
总的来说。或者在这里(如dreamlax所述)

self.dictKeyArray = ...;

因为您指的是代码所在的特定类的对象。

只有这样才能确保访问者正确保留您的对象。否则编写访问者代码根本没有意义,因为它永远不会被调用。

请注意:正如Josh在评论中所说,您的代码应该是有效的(至少从我的角度来看)。我建议的解决方案并不像您那样容易出错,因为您遵守规则(可以在不久的将来免除您的头痛)。

答案 1 :(得分:1)

您应该使用self.dictKeyArray = ...。如果没有self.,您将直接访问实例变量,绕过属性的任何内存管理优势,但是,请记住您拥有mutableCopy的结果,并且分配给也拥有所有权的属性将导致双重所有权,所以使用:

self.dictKeyArray = [[[storeDict allKeys] mutableCopy] autorelease];