В чем разница между self.foo = nil и [self setFoo: nil]? - PullRequest
0 голосов
/ 01 марта 2012

В xcode после создания подкласса UIViewController в методе viewDidUnload есть комментарий, добавленный xcode:

- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

Здесь xcode рекомендует использовать self.myOutlet = nil для освобождения объекта.

Но в xcode4 есть классная функция: вы можете просто перетащить выход Interface Builder в заголовочный файл его владельца, тогда xcode автоматически создаст объект IBOutlet и соответствующий код выпуска в методе viewDidUnload.

Проблема в приведенном выше сценарии, сгенерированный код выглядит примерно так:

- (void)viewDidUnload {
    [super viewDidUnload];
    [self setFoo:nil];
}

Я упоминаю, что "self.foo = nil;" заменяется на «[self setFoo: nil];».

Кто-нибудь знает разницу? Если нет никакой разницы, почему xcode4 меняет это?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 01 марта 2012

Оба эти вызова будут выполнять одно и то же.

self.foo = nil;

- это версия с синтаксисом точек:

[self setFoo:nil];

Нет разницы в производительности, просто вопрос о том, какВам нравится писать свой код.

2 голосов
/ 01 марта 2012

В исполняемом файле нет разницы между двумя синтаксисами. Единственная техническая причина, по которой Xcode явно использует метод setter, заключается в совместимости с кодом до Objective-C 2.0, который не поддерживает синтаксис точек. Я не знаю, почему Xcode должен был поддерживать эту совместимость; возможно, часть Xcode, которая генерирует выражение set-to-nil, старше, чем Objective-C 2.0.

Или, может быть, тот, кто написал эту часть XCode, просто не любит точечный синтаксис. Когда впервые был введен точечный синтаксис, многим это не понравилось.

http://weblog.bignerdranch.com/?p=83
http://www.cimgf.com/2008/07/08/a-case-against-dot-syntax/
http://cocoawithlove.com/2008/08/in-defense-of-objective-c-20-properties.html

0 голосов
/ 01 марта 2012

Я думаю, self.foo может быть setter/getter в зависимости от использования, в то время как [self setFoo] является явным вызовом setter.

При обычном использовании оба должны быть одинаковыми.

Запись в блоге с точечной нотацией в Задаче C http://weblog.bignerdranch.com/?p=83

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