Доступ к свойствам iOS Xcode 4

Недавно я перешел на Xcode 4 и не совсем понимаю этот новый способ написания средств доступа. Например, в классе делегата приложения, который автоматически генерируется при создании нового проекта, объект window объявляется не в @interface, а именно так:

@property (nonatomic, retain) IBOutlet UIWindow *window;

Затем в файле реализации у нас есть файл @synthesize window=_window;. А в функциях у нас либо self.window, либо _window.

Например:

[self.window makeKeyAndVisible]; // in didFinishLaunchingWithOptions function
[_window release]; // in dealloc function

Можете ли вы объяснить мне разницу, почему в @interface ничего нет, почему мы делаем @synthesize window=_window; вместо @synthesize window; и в чем разница между self.window и _window, я имею в виду, когда мне нужно звонить одному больше, чем другому?

Я немного растерялся и чувствую, что новый код, который я делаю, пытается сделать то же самое, но не работает должным образом...

Спасибо!


person Dachmt    schedule 25.05.2011    source источник


Ответы (2)


  1. "Почему ничего нет в @interface"

    Среда выполнения синтезирует для вас ivar.

  2. "Почему мы делаем @synthesize window=_window;

    Это означает, что свойство window будет использовать ivar с именем _window (по умолчанию имя ivar является именем свойства).

  3. "В чем разница между self.window и _window?"

    Первый использует метод "геттера" window (т. е. foo = [self window]), а второй напрямую обращается к ivar.

  4. «Почему я должен звонить одному больше, чем другому?»

    Обычно считается небезопасным использовать методы доступа в вашем методе dealloc, а это означает, что использование ivar предпочтительнее.

person Dave DeLong    schedule 25.05.2011

Это не имеет ничего общего с Xcode 4. Это Objective-C 2.0 (который Xcode 4 использует по умолчанию при создании шаблонов проектов).

Я рекомендую прочитать главу о свойствах в The Objective -C Язык программирования, это должно прояснить ситуацию.

И делать вещи «по-старому» все равно будет работать. Вам не нужно менять все за одну ночь, просто удалите автоматически созданный код, если он вам не нравится, пока вы не почувствуете себя комфортно с новым синтаксисом.

person puzzle    schedule 25.05.2011
comment
Да, я прочитал все руководство по языку программирования Objective-C, я вспомнил @synthesize window=_window;. Просто нужно было немного обновить это, чтобы сделать мой разум очень ясным, и вы, ребята, мне помогли. Спасибо @puzzle за дополнительную информацию! - person Dachmt; 26.05.2011