我尝试了解ObjectiveC中的内存管理,但仍然有些事情对我来说是一种痛苦。 我有一个实例变量:
NSMutableArray *postResultsArray;
在UI中单击按钮时,我创建了新数组:
self.postResultsArray = [NSMutableArray array];
然后我将一些对象添加到数组中,当整个操作完成后,我想释放数组:
[self.postResultsArray release];
(我假设数组中存储的所有对象都将与数组一起释放)。 当我再次单击该按钮并在代码中我想再次创建数组时出现问题:
self.postResultsArray = [NSMutableArray array];
我明白了:
[CFArray release]:发送到解除分配的实例0x3d9e390的消息
我不能第二次初始化相同的实例变量吗?或者我不应该发布它?如果是这样,为什么?
谢谢!
答案 0 :(得分:2)
不要这样:
[self.postResultsArray release];
执行此操作时,仍会将ivar分配给旧阵列的内存地址。如果要释放阵列,有两种安全的方法:
[postResultsArray release];
postResultsArray = nil;
或者
self.postResultsArray = nil;
发生的事情是设置postResultsArray的代码看起来像这样(意译不准确):
-(void)setPostResultsArray:(NSMutableArray *)newArray {
[array retain];
[postResultsArray release]; // this is what's causing the the deallocation message in your log
postResultsArray = array;
}
答案 1 :(得分:1)
您不应手动释放通过属性访问的对象。而不是
[self.postResultsArray release];
DO
self.postResultsArray = nil;
一切都会好的。 setter将释放旧数组,然后将nil
分配给指针。现在发生的事情是,当你为属性分配一个新数组时,setter试图释放旧数组,但你已经释放了那个数组,因此错误。
答案 2 :(得分:0)
不要执行[self.postResultsArray release];
,执行self.postResultsArray = nil
,这与属性的实现有关。它们将自动释放当前存储的任何内容并保留新值。
答案 3 :(得分:0)
如果您使用其中一条“init”消息创建对象,或者明确要求自己保留,则只需要调用release。因为你不需要调用release,因为创建数组的代码将处理释放 - 最有可能是使用autorelease。