ivar проверяет, был ли он инициализирован и использован - PullRequest
0 голосов
/ 30 сентября 2011

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

@property(nonatomic, retain) MyObject* test;

.m

@synthesize test;

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

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

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

Спасибо!

Ответы [ 4 ]

2 голосов
/ 30 сентября 2011

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

0 голосов
/ 30 сентября 2011

это прекрасно. также более идиоматично просто пропустить тест для 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, которые компилятор вызывает для обмена сообщениями, а также некоторые другие общие подпрограммы.

0 голосов
/ 30 сентября 2011

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

- (void)dealloc
{
    [test release];
    // ...
0 голосов
/ 30 сентября 2011

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

self.test = nil;

Edit:

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

...