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

Objective c 在cocos2d和目标C中分配或保留,objective-c,ios,memory-management,cocos2d-iphone,Objective C,Ios,Memory Management,Cocos2d Iphone,以下是我目前的情况: 我有一个名为dictKeyArray的NSMutableArray,我用@property(非原子,保留)NSMutableArray*dictKeyArray分配了一个属性 我在实现文件中合成可变数组。 后来,我有了一个字典名storeDict。我将字典的所有键分配给dictKeyArray,如下所示: dictKeyArray=[[storeDict allKeys]mutableCopy] 现在,我将在稍后的实现文件中使用此词典。然而,当涉及到释放它时,我会在我的d

以下是我目前的情况: 我有一个名为dictKeyArray的NSMutableArray,我用
@property(非原子,保留)NSMutableArray*dictKeyArray分配了一个属性
我在实现文件中合成可变数组。
后来,我有了一个字典名storeDict。我将字典的所有键分配给dictKeyArray,如下所示:
dictKeyArray=[[storeDict allKeys]mutableCopy]

现在,我将在稍后的实现文件中使用此词典。然而,当涉及到释放它时,我会在我的
dealoc
方法中释放它一次。使用仪器检查时,会出现泄漏!为什么磁盘阵列泄漏?我应该使用
assign
而不是
retain
? 我还不清楚到底有什么区别。。。 谢谢大家!

您必须发送一个

[[[storeDict allKeys] mutableCopy] autorelease];
只是想说明一下:
mutableCopy
的作用与
alloc
的作用相同,这意味着您正在声明所讨论对象的所有权。您必须将重新计数减少一

顺便说一下:你应该使用你为它编写的访问器。你现在只是把它分配给你的iVar。如果你想让你的访问器工作,你必须使用

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

因为您引用的是这个特定类的对象,所以代码就在其中

只有这样,您才能确保对象被访问者正确保留。否则,编写访问器代码毫无意义,因为它从未被调用


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

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

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

您是否曾经更改
dictKeyArray
指向的内容?如果是这样,你需要释放之前的值。我不断重复我自己:通过使用ARC摆脱这些丑陋的内存管理问题!嗯……很有趣。那么,添加的自我究竟是什么呢。做如果没有self,属性的内存管理优势是什么。?谢谢self确保访问器真正被调用。您要做的是为iVar分配另一个对象引用。这不是你想要的。self是对调用消息的对象的引用(此代码所属的类的实例)。self确保使用属性访问器方法
self.dictKeyArray=…
完全等同于您声明和合成的方法
[self-setDictKeyArray:…]
。如果您忘记了
self.
,则您没有使用任何访问器方法。在没有
autorelease的情况下直接分配给ivar意味着内存管理是正确的。(除了泄漏
dictKeyArray
中已有的内容)是的。你完全正确。不应该有泄漏(至少在这一点上)。我建议他这样做,因为这是最好的方法。但正如乔希所说:我所说的是在做一些事情,嗯,什么都没有。首先,您要释放它,以便再次保留它。差异+-0。我的帖子是为了确保他将来不会因为胡说八道和不遵守有效和有用的规则而遇到问题,即:始终使用访问器。只有这样才能确保你在未来能够顺利前行。
self.dictKeyArray = [[[storeDict allKeys] mutableCopy] autorelease];