Objective c 在Objective C中取消分配对象数组的正确方法

Objective c 在Objective C中取消分配对象数组的正确方法,objective-c,memory-management,Objective C,Memory Management,我是Objective-C新手,仍然没有完全掌握内存管理。我有一个NSMUTABLE指针数组 NSMutableArray *itemArray; 在整个程序中,我都会向其中添加项目 //start loop MyItem *x = [[MyItem alloc] init]; [itemArray addObject:x]; //end loop 当我想要丢弃数组中的所有项并重新填充它时,就会出现这种情况。我是按照直觉告诉我的那样在整个数组中循环并向数组中的每个对象发送释放消息,然

我是Objective-C新手,仍然没有完全掌握内存管理。我有一个NSMUTABLE指针数组

NSMutableArray *itemArray;
在整个程序中,我都会向其中添加项目

//start loop    
MyItem *x = [[MyItem alloc] init];
[itemArray addObject:x];
//end loop
当我想要丢弃数组中的所有项并重新填充它时,就会出现这种情况。我是按照直觉告诉我的那样在整个数组中循环并向数组中的每个对象发送释放消息,然后移除所有对象,还是移除所有对象负责减少所有引用计数?以下是正确的吗

//start loop
[[itemArray objectAtIndex:i] release];
//end loop
[itemArray removeAllObjects];

只需调用
-removeAllObjects
。添加到
NSArray
的对象将由阵列保留,并在移除时释放

请注意,如果使用
+alloc
创建对象,则还必须使用匹配的
-release
-autorelease
将其释放到某个位置。在创建对象时,似乎没有。要么:

MyItem *x = [[[MyItem alloc] init] autorelease];
[itemArray addObject:x];


将起作用。

只需调用
-removeAllObjects
。添加到
NSArray
的对象将由阵列保留,并在移除时释放

请注意,如果使用
+alloc
创建对象,则还必须使用匹配的
-release
-autorelease
将其释放到某个位置。在创建对象时,似乎没有。要么:

MyItem *x = [[[MyItem alloc] init] autorelease];
[itemArray addObject:x];


将起作用。

NSArray上的“添加”方法组保留您传入的对象,而“删除”方法组释放它们,因此您可以使用第二种方法。实际上,您的第一个方法(向每个对象发送release,然后调用removeAllObjects)很可能会导致抛出错误的\u EXEC\u访问异常。

NSArray上的“add”方法组保留您传入的对象,而remove方法组释放它们,因此您可以使用第二个方法。实际上,您的第一个方法(向每个对象发送release,然后调用removeAllObjects)很可能导致抛出错误的\u EXEC\u访问异常。

您遇到的真正问题是:

//start loop    
MyItem *x = [[MyItem alloc] init];
[itemArray addObject:x];
//end loop
您正在分配一个对象(因此您拥有所有权),然后将其粘贴到阵列中,并且从不释放它。您应该这样做:

//start loop    
MyItem *x = [[MyItem alloc] init];
[itemArray addObject:x];
[x release];
//end loop
或者这个:

//start loop    
MyItem *x = [[[MyItem alloc] init] autorelease];
[itemArray addObject:x];
//end loop
一旦您将其添加到数组中,该数组将通过保留对象而获得所有权,因此您不必自己保留它。当您调用
-removeAllObjects
时,数组将根据需要释放它们。基本上,一旦你把它交给阵列,你就不必担心它了


您应该开始习惯使用,这样您就不必担心释放对象,因为编译器会为您完成这项工作。

真正的问题是:

//start loop    
MyItem *x = [[MyItem alloc] init];
[itemArray addObject:x];
//end loop
您正在分配一个对象(因此您拥有所有权),然后将其粘贴到阵列中,并且从不释放它。您应该这样做:

//start loop    
MyItem *x = [[MyItem alloc] init];
[itemArray addObject:x];
[x release];
//end loop
或者这个:

//start loop    
MyItem *x = [[[MyItem alloc] init] autorelease];
[itemArray addObject:x];
//end loop
一旦您将其添加到数组中,该数组将通过保留对象而获得所有权,因此您不必自己保留它。当您调用
-removeAllObjects
时,数组将根据需要释放它们。基本上,一旦你把它交给阵列,你就不必担心它了


您应该开始习惯使用,这样您就不用担心释放对象了,因为编译器会帮您完成这项工作。

。。。这是否意味着每当分配指向对象的指针时,引用计数就会增加,而每当指针被取消分配时,引用计数就会减少?例如,如果我有一个指向某个函数的本地指针,那么该对象的ref计数会一直增加,直到函数返回并且指针从堆栈中弹出为止?我是作为一名C程序员长大的,所以我觉得很难相信这种魔法。不,它更像是手册,规则是惯例,而不是魔法。调用
-retain
时,引用计数递增;调用
-release
-autorelease
时,引用计数递减。简单地将对象分配给指针对引用计数没有影响。按照惯例,名称以“new”、“alloc”或“copy”开头的方法返回的对象的引用计数已经为您递增,这意味着您必须平衡这些方法调用和匹配的发布。其他返回对象的方法通常会返回一个已被保留和自动删除的对象,因此它将一直保留到当前运行循环结束,您无需担心释放它。如果你想保留这样一个对象,你就必须保留它。请注意,Apple在Lion和XCode 4.1中引入了一个新功能,即自动引用计数(或ARC),编译器将负责为你插入保留和释放,这使得代码的外观和行为与我刚才告诉您的魔法完全一样,根本不存在。:)哦所以addObject函数是保留。。。因此,要习惯这一点,必须信任API编写者,阅读您正在使用的函数的文档,了解它们的约定……所以。。。这是否意味着每当分配指向对象的指针时,引用计数就会增加,而每当指针被取消分配时,引用计数就会减少?例如,如果我有一个指向某个函数的本地指针,那么该对象的ref计数会一直增加,直到函数返回并且指针从堆栈中弹出为止?我是作为一名C程序员长大的,所以我觉得很难相信这种魔法。不,它更像是手册,规则是惯例,而不是魔法。调用
-retain
时,引用计数递增;调用
-release
-autorelease
时,引用计数递减。简单地将对象分配给指针对引用计数没有影响。按照惯例,名称以“new”、“alloc”或“copy”开头的方法将返回已经具有