Что именно происходит, когда я устанавливаю свойство nil в методе dealloc? - PullRequest
1 голос
/ 24 апреля 2009

Пример

-(void)dealloc {
    self.myOutletProperty = nil;
    [super dealloc];
}

Полагаю, будет вызван своего рода виртуальный сеттер. Но что именно здесь происходит? Почему ноль?

Ответы [ 4 ]

12 голосов
/ 24 апреля 2009

Вы должны знать, что это просто синтаксический сахар.

например:

@property(nonatomic, retain) NSString *myString;

преобразуется в

- (NSString*)myString { 
    return myString; 
}

- (void)setMyString:(NSString*)newString {
    if (myString != newString) {
        [myString release];
        myString = [newString retain];
    }
}

так что, если вы объявите @property чем-то, то на самом деле будет выпущено

7 голосов
/ 24 апреля 2009

1. Если тип свойства «копировать» или «сохранить», то

self.myOutletProperty = ноль; совпадает с [релиз myOutletProperty];

2. Если тип свойства «назначить», то

self.myOutletProperty = ноль; ничего не делать

2 голосов
/ 25 апреля 2009

Следует иметь в виду, что хотя установка свойства nil будет работать нормально, я рекомендую вместо этого вызывать [object release] в вашем методе dealloc. Таким образом, вы в безопасности, если вы напишите наш собственный метод установки, который ссылается на другой ivar (который, возможно, уже был выпущен), или у вас есть уведомления KVO, зарегистрированные в этом свойстве где-то еще.

1 голос
/ 24 апреля 2009

Ноль такой же, как ноль, но для объектов. Это означает, что нет объекта.

Синтаксис точки совпадает с вызовом [self setMyOutletProperty: nil].

То есть вы просто удаляете объект из некоторого свойства. Значение зависит от того, о какой собственности вы говорите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...