Освобождение объекта напрямую

#objective-c #memory-management #garbage-collection #dealloc

#objective-c #управление памятью #сбор мусора #освободить выделение

Вопрос:

Я все еще изучаю objective-C, и есть правило, никогда не освобождать объект напрямую напрямую. Я не понимаю, что это значит.

Может кто-нибудь привести мне пример нарушения этого правила..

вот как это должно быть сделано.

ПРАВИЛЬНЫЙ СПОСОБ

 -(id)someMethod {
Class *object = [[Class alloc]init];
[object someMethod];
[object release];
}
 

Вышесказанное считается правильным..

Так в чем же плохой способ? заранее спасибо.

Ответ №1:

никогда не освобождать объект напрямую

Это означает, что вы никогда не должны отправлять сообщение -dealloc объекту напрямую — единственной допустимой ситуацией для этого является отправка dealloc в суперкласс в реализации dealloc:

 - (void)dealloc{
   ...
   [super dealloc];
}
 

Также обратите внимание, что с ARC (автоматический подсчет ссылок) вы не должны вызывать dealloc даже в этом случае.

Ответ №2:

никогда не следует напрямую освобождать объект напрямую

Это означает, что вы не должны вызывать deallocate метод object напрямую:

 -(void)someMethod {
    Class *object = [[Class alloc]init];
    [object someMethod];
    [object release];    // <- it is correct
    [object dealloc]; // <- error here!
}
 

Комментарии:

1. Я добавлю, что метод неверен, поскольку он должен возвращать идентификатор и ничего не возвращает

2. Большое спасибо 🙂 Всем троим, кто ответил, вы очень помогли. Теперь я понимаю.

3. О, и да, Джеффруа, это правда, я не обращал внимания на возвращаемый тип .. он должен быть -(void), поскольку ничего не возвращалось, но я просто быстро написал. 🙂

Ответ №3:

Неправильным способом было бы вызывать [object dealloc] напрямую, что приведет к уничтожению объекта. Он будет вызван release , как только его больше никто не сохранит.