ivar проверить, был ли он инициализирован и использован

скажем, у меня есть переменная экземпляра MyObject* test;

@property(nonatomic, retain) MyObject* test;

.m

@synthesize test;

Я мог бы инициализировать его или мог бы сейчас, в зависимости от того, нужно ли мне это. Если мне это не нужно, нет смысла тратить на инициализацию.

Вопрос в делелоке, безопасно ли делать следующую проверку и релиз?

-(void) dealloc
{
  if ( test != nil )
  {
   [test release];
  }
{

Спасибо!


person Zsolt    schedule 30.09.2011    source источник


Ответы (4)


это прекрасно. также более идиоматично просто пропустить тест для nil.

за кулисами компилятор (обычно*) генерирует вызов objc_msgSend или одного из его вариантов. реализация objc_msgSend (и вариантов) позволяет объекту, который вы сообщаете, быть nil в том смысле, что он хорошо определен и не считается ошибкой программиста для сообщения nil. возвращаемое значение objc_msgSend+ вариантов обнуляется:

пример:

NSString * string = nil;
NSString * copy = [string copy]; << copy will be 0/nil
NSUInteger length = [copy length]; << length will be 0

это означает, что вы должны проверить на nil, если возвращаете объект C++ - конструктор не будет вызываться, если получатель равен nil.

*как правило, в том смысле, что есть несколько функций C, которые компилятор вызывает для выполнения обмена сообщениями, а также некоторые другие общие процедуры.

person justin    schedule 30.09.2011

Да, это безопасно. Однако отправка release в nil не вызовет никаких проблем, поэтому вам не нужно проверять это.

person Fran Sevillano    schedule 30.09.2011
comment
Я хотел бы добавить, что отправка любого метода в nil не вызовет никаких проблем. - person JustSid; 30.09.2011

Вам не нужно этого делать. Вы можете просто сделать это, если назначите объект autoreleased для ivar:

self.test = nil;

Редактировать:

Не забудьте вызвать [super dealloc] в конце функции dealloc.

person Circumflex    schedule 30.09.2011

Это безопасно, но не является стандартной практикой. Вы можете безопасно отправлять сообщения нулевым ссылкам, и это большая часть того, как написан идиоматический Objective-C. Просто отпустите ивар:

- (void)dealloc
{
    [test release];
    // ...
person Mike Weller    schedule 30.09.2011