Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone NSMutableArray属性-释放子级_Iphone_Objective C_Ios - Fatal编程技术网

Iphone NSMutableArray属性-释放子级

Iphone NSMutableArray属性-释放子级,iphone,objective-c,ios,Iphone,Objective C,Ios,以下是我运行以下代码时看到的内容: // Dealloc on MyClass not called MyClass* c = [MyClass new]; self.a = [NSMutableArray new]; [self.a addObject:c]; [c release]; [a release]; // Dealloc on MyClass called MyClass* c2 = [MyClass new]; NSMutableArray* a2 = [NSMutableAr

以下是我运行以下代码时看到的内容:

// Dealloc on MyClass not called
MyClass* c = [MyClass new];
self.a = [NSMutableArray new];
[self.a addObject:c];
[c release];
[a release];

// Dealloc on MyClass called
MyClass* c2 = [MyClass new];
NSMutableArray* a2 = [NSMutableArray new];
[a2 addObject:c2];
[c2 release];
[a2 release];

// Dealloc on MyClass called
MyClass* c3 = [MyClass new];
a = [NSMutableArray new];
[a addObject:c3];
[c3 release];
[a release];
为什么在第一个示例中没有调用dealloc

编辑:

我想我误解了这一切。基本上我需要做的是:

NSMutableArray* alocal = [NSMutableArray new]; // alocal has a retain count of 1
self.a = alocal; // a has a retain count of 1
[alocal release]; // alocal has a retain count of 0
[a release]; // a has a retain count of 0

需要注意的是,使用自动释放/数组选项(#2和#3),a不会立即释放,因此如果您想要更多控制,请使用选项#1


谢谢

这取决于您如何实现属性“a” 应该是:

@property (retain) NSMutableArray *a;
另外,当使用“new”时,它会放置一个分配,因此您应该像这样自动释放它:

self.a = [[NSMutableArray new] autorelease];

因为在第一个示例中,假设
a
是一个retain/copy属性,那么数组就会泄漏

self.a = [NSMutableArray new];
顺便说一下,这与第三个例子不同:

a = [NSMutableArray new];
在第三种情况下,对象直接分配给ivar(不涉及属性设置器)

返回第一个示例,方法
new
返回一个保留的对象(+1),然后属性设置器也保留该对象(+2)。然后,当属性被释放(-1)时,您将得到+1。这是错误的。你需要平衡你的保留/释放,以+0结束

一个简单的解决方案是使用方便的构造函数:

在这种情况下,方法
array
返回一个自动释放的对象(+0),而属性设置器保留对象(+1),该对象通过释放属性(-1)来平衡,最终得到+0


此外,在第一个示例中,通过ivar释放设置为特性的对象:

[a release];
因此,该属性现在持有一个指向可能解除分配的对象的指针。由于您放弃了该对象的所有权,因此无法保证该对象在将来仍然存在。如果该对象实际上被解除分配(因为它没有任何其他所有者),那么指针仍将指向该对象所在堆中的内存地址;除了现在,该地址可能包含任何内容:所述对象的旧位模式,或不相关的对象,或绝对垃圾

如果您向解除分配的对象发送消息,则不会发生任何好事,例如,它会使您的应用程序崩溃。要避免这种情况,请通过属性释放对象:

self.a = nil;

当我这样做时,self.a=[NSMutableArray];仍然没有调用dealloc。另外,当我调用…self.a=[[NSMutableArray new]autorelease];dealloc仍然没有被调用。@user472292现在数组不再泄漏,应该调用它。一定还有别的事。你能提供更多细节吗?我很确定阵列没有泄漏。在调用[a release]之前,我检查了retain计数,结果是1。@user472292属性
a
是如何声明的?默认情况下,属性是
assign
,因此如果不指定任何内容,则它们是
assign
,通常用于您不拥有的基本类型和对象,如委托。在这种情况下,应该是
retain
copy
,这是我的文章的第一个假设。那么,它是如何声明的呢?@property(非原子,retain)NSMutableArray*a;当我这样做时,self.a=[NSMutableArray];仍然没有调用dealloc。另外,当我调用…self.a=[[NSMutableArray new]autorelease];dealloc仍然没有被调用。有趣的是。。。所以基本上你希望它在那一刻被释放,是吗?听起来很公平。通常我们只是让池自动释放,但你是对的,它不会立即释放。
self.a = [NSMutableArray array];
[a release];
self.a = nil;