#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
, как только его больше никто не сохранит.