Удаление объектов в obj-c - PullRequest
       5

Удаление объектов в obj-c

0 голосов
/ 19 февраля 2012

Как я должен удалить объекты? Например, у меня есть NSDictionary и некоторые NSStrings из него:

NSDictionary *dict = [NSDictionary dictionaryWithObjects....];
NSString *str = [dict objectForKey:@"key"];

[str release]; или [str dealloc]; или str = nil или это объект автоматического выпуска?

Если я удалю не autorelease dict, будут ли удалены все дети?

Ответы [ 4 ]

3 голосов
/ 19 февраля 2012

Управление памятью в задаче c основано на владении объектом. Если вы владеете объектом, вы должны освободить этот объект.
Какао устанавливает следующую политику:

Вам принадлежит любой созданный вами объект
Вы создаете объект, используя метод, имя которого начинается с «alloc», «new», «copy» или «mutableCopy» (например, alloc, newObject или mutableCopy).

Вы можете стать владельцем объекта, используя команду retain.

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

Вы не должны уступать право собственности на объект, которым вы не владеете

Это всего лишь следствие предыдущих правил политики, прямо заявленных.
В вашем случае

NSDictionary *dict = [NSDictionary dictionaryWithObjects....];
NSString *str = [dict objectForKey:@"key"];  

вы не являетесь владельцем str, поэтому вы не должны освобождать этот объект.

2 голосов
/ 19 февраля 2012

Если вызов не заканчивается на retain, copy или mutableCopy, alloc или new, вы не должны использовать release или autorelease. Объект уже выпущен автоматически.

NSString *str = [[NSString alloc] initWithString:@"123"]; <- needs release
NSString *str = [aString copy]; <- release
NSString *str = [aString mutableCopy]; <- release
NSString *str = [aString retain]; <- release
NSString *str = [NSString new]; <- release

everything else <- don't release. 

есть только одно допустимое использование dealloc. Это в [super dealloc]; в вашем - (void)dealloc методе.

Если словарь освобождается, все объекты и ключи, которые он содержит, освобождаются. Если они не сохраняются где-то еще, они также освобождаются.

Существует множество документов по управлению памятью. Например, Apple Расширенное руководство по программированию управления памятью

2 голосов
/ 19 февраля 2012

для удаления определенных объектов вам нужно сделать объект изменяемый .

Большинство типов данных target-c имеют значение mutable, например

NSMutableDictionary,NSMutableArray..etc

, затем просто вызовите .. [yourObject removeObjectatIndex:someInteger] или [yourObject RemoveAllObjects] для удаления объектов.

Releasing или auto releasing объект - это совершенно другая вещь ... он освободит памятьвесь этот объект (Dict..array..etc) занимает ..

1 голос
/ 19 февраля 2012

что значит "удалить"?Предположим, вы имеете в виду dealloc или free

str сохраняется на dict, и если вы не набрали retain на него, вам не следует звонить release на него.

и вы должны никогда вызывать dealloc для любого объекта


NSDictionary *dict = [NSDictionary dictionaryWithObjects....];

dict - это объект с автоматическим освобождением, что означает, что он будет освобожден в следующем цикле выполнения, если вы этого не сделалисохраните его где угодно

все в dict сохранено им, поэтому они не будут освобождены до тех пор, пока dict не будет освобождено

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...