Инициируйте объект, затем сохраните его в NSArray. Это будет утечка? - PullRequest
3 голосов
/ 28 января 2011

Если возвращенный объект приходит ко мне сохраненным, поэтому я владею им и храню его в NSArray, который сохраняет то, что хранится в нем, могу ли я рассчитывать на NSArray, чтобы увидеть, что он уже сохранен, и не увеличивать количествоили мне нужно пройти через массив и уменьшить счетчик сохранения, чтобы не было утечки памяти?

Ответы [ 5 ]

6 голосов
/ 28 января 2011

Похоже, вам нужно прочитать Руководство по программированию управления памятью . Ваш случай чрезвычайно прост. Вы владеете объектом. Вы передаете его в массив, который теперь также принадлежит ему. Вы должны освободить свое право собственности на него. В противном случае вы утечете.

4 голосов
/ 28 января 2011

Чтобы убедиться, что право собственности на объект, который был добавлен в NSArray, отменено, отправьте объекту сообщение -release сразу после добавления его в NSArray. Если вы этого не сделаете, то у вас действительно будет утечка памяти.

Вот что происходит:

NSString *str = [[NSString alloc] initWithFormat:@"%@", @"Blah"]; //retain count is 1, you own this object
[array addObject:str]; //retain count gets bumped to 2
[str release]; //retain count is 1 - relinquishing ownership here.
//There is no leak because when the NSArray is
//deallocated, the object will be sent the release message.

Но если вы не отправите принадлежащий вставленный объект в сообщение -release, то даже когда NSArray освобожден, у объекта будет только счетчик хранения 1 память, полученная объектом, никогда не будет возвращена, что приведет к утечке.

2 голосов
/ 28 января 2011

Всякий раз, когда вы выпускаете NSArray, он освобождает все, что он сохраняет.

Таким образом, до тех пор, пока вы освобождаете инициированный объект, как только вы добавили его в NSArray (так что это единственное, что сохраняет его), или освободите его, как только вы закончили с ним вне массива, все должно хорошо.

Кстати, есть хороший пост в блоге под названием " управление памятью Objective-C для ленивых людей ", который довольно хорошо объясняет такие вещи и является удобным справочником, если вы только начинаете с таких вещей. 1007 *

1 голос
/ 28 января 2011

Вам не нужно этого делать. NSArray становится владельцем любого объекта, который он хранит. Он освободит свои объекты, когда освободится. Если вы сохраняете объект самостоятельно, вы также получаете право собственности и несете ответственность за его освобождение.

0 голосов
/ 28 января 2011

NSArray будет сохранять ваш объект при добавлении, а затем освобождать его при удалении из массива. Это по замыслу. Это означает, что для обеспечения утечки памяти, если вы уже сохранили объект перед добавлением его в массив, вы должны освободить его после удаления из массива:

NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:10];
NSObject *object = [[NSObject alloc] init]; // retain count of 1 (because of alloc)
[object retain]; // useless, just for example, retain count of 2 (because of retain)
[array addObject:object]; // array is mutable, retain count of 3 (because of addObject:)
[array removeObject:object]; // retain count of 2
[object release]; // retain count of 1
[object release]; // retain count of 0, the object is dealloc'd afterwards
[array release]; // to be sure that we are not leaking an array, too
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...