Освобождение объекта в dealloc - PullRequest
2 голосов
/ 29 июля 2010

В моем классе Objective C я alloc и release объект несколько раз. Я также должен выпустить его в dealloc. Но если это уже было выпущено ранее, я мог бы получить крах. Законно ли устанавливать объект на nil после его освобождения? В каких случаях это будет неправильно и вызовет еще больше проблем?

1 Ответ

2 голосов
/ 29 июля 2010

Да Да, да. Вы почти всегда должны установить его равным нулю после выпуска, именно по той причине, которую вы упомянули. Вам не нужно, если вы никогда не получите к нему доступ снова (как в dealloc) или если вы сразу же установите его на что-то другое.

Это очень полезно, потому что в Obj-C есть функция «nil messaging»: если вы отправляете сообщение nil, оно не вылетает, оно просто ничего не делает. Итак:

MyClass *obj = [[MyClass alloc] init];
[obj doSomething]; // this works
[obj release]; // obj is now invalid
[obj doSomething]; // and this would crash

// but...
MyClass *obj = [[MyClass alloc] init];
[obj doSomething]; // this works
[obj release]; // obj is now invalid
obj = nil; // clear out the pointer
[obj doSomething]; // this is a no-op, doesn't crash

Другой пример, основанный на вашем комментарии:

// we have an object
MyObject *obj = [[MyObject alloc] init];

// some other object retains a reference:
MyObject *ref1 = [obj retain];

// so does another:
MyObject *ref2 = [obj retain];

// we don't need the original reference anymore:
[obj release];
obj = nil;

[ref1 doSomething]; // this works
// now we're done with it
[ref1 release];
ref1 = nil;

// but someone else might still want it:
[ref2 doSomething]; // this works too!
[ref2 release];
ref2 = nil; // all cleaned up!

Прочтите Рекомендации по управлению памятью !

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