Если вы являетесь владельцем объекта, вам придется его освободить.
NSMutableArray *list = [[NSArray alloc] init];
NSString *str = [[NSString alloc] init] // you are the owner of this object
[list addObject:str];
[str release]; // release the object after using it
[list release];
Если вы не являетесь владельцем объекта, тогда вы не должны отпускать его.
NSMutableArray *list = [[NSArray alloc] init];
NSString *str = [NSString string]; // you are not owning this object
[list addObject:str]; // str retain count is incremented
[list release]; // str retain count is decremented.
Это концепция, которую также использует массив. Когда вы добавляете какой-либо объект в массив, массив сохранит его. В том смысле, что он становится владельцем этого объекта, и он освободит этот объект, когда вы освободите массив.
Я удалил свой ответ с февраля 2011 года, поскольку в нем содержится некорректная информация. В нем я сказал, что вам нужно использовать [x removeAllObjects], чтобы обеспечить выделение содержащихся объектов. Это похоже на правду: если вы создали NSMutableArray, используя [[NSMutableArray alloc] init], это, конечно, не так. Чтобы гарантировать, что содержащиеся объекты в AUTORELEASED NSMutableArray будут удалены и отправлены релиз, когда вы закончите с ним, а не когда массив будет выпущен пулом, он применим. помимо наивности, что меня отбросило, так это то, что над кодом фактически выводится NSArray в NSMutableArray. – unsynchronized 2011-11-18 21:10:43