#iphone #init #dealloc #ivar
#iPhone #инициализация #освободить #ivar
Вопрос:
допустим, у меня есть переменная экземпляра MyObject * test;
@property(nonatomic, retain) MyObject* test;
.m
@synthesize test;
Я мог бы инициализировать его или мог бы сейчас, в зависимости от того, нужно ли мне это. Если мне это не нужно, нет смысла тратить время на инициализацию.
Вопрос заключается в освобождении, безопасно ли выполнять следующую проверку и выпуск?
-(void) dealloc
{
if ( test != nil )
{
[test release];
}
{
Спасибо!
Ответ №1:
Да, это безопасно. Однако отправка release
в ноль не вызовет никаких проблем, поэтому вам не нужно проверять это.
Комментарии:
1. Я хотел бы добавить, что отправка любого метода в nil не вызовет никаких проблем.
Ответ №2:
это совершенно нормально. также более идиоматично просто опустить тест nil
.
за кулисами компилятор (обычно * ) генерирует вызов objc_msgSend
или один из его вариантов. реализация objc_msgSend
(и варианты) позволяет объекту, которым вы сообщаете nil
, быть в том смысле, что он четко определен и не считается ошибкой программиста для сообщения nil
. возвращаемое значение objc_msgSend
variations обнуляется:
пример:
NSString * string = nil;
NSString * copy = [string copy]; << copy will be 0/nil
NSUInteger length = [copy length]; << length will be 0
это означает, что вы должны проверить значение nil, если возвращаете объект c — конструктор не будет вызван, если получатель равен нулю.
* как правило, в том смысле, что существует несколько функций c, которые компилятор вызывает для выполнения обмена сообщениями, а также некоторых других распространенных процедур.
Ответ №3:
Вам не нужно этого делать. Вы можете просто сделать это, если назначите автоматически освобожденный объект ivar:
self.test = nil;
Редактировать:
Не забудьте вызвать [super dealloc]
в конце функцию dealloc
Ответ №4:
Это безопасно, но не стандартная практика. Вы можете безопасно отправлять сообщения с нулевыми ссылками, и это большая часть того, как написан идиоматический Objective-C. Просто отпустите ivar:
- (void)dealloc
{
[test release];
// ...