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

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

@property(nonatomic, retain) MyObject* test;

.m

@synthesize test;

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

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

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

Спасибо!

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

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

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

self.test = nil;

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

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

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

- (void)dealloc
{
    [test release];
    // ...
Другие вопросы по тегам