iPhone Dev - Использование геттера в одном классе - PullRequest
0 голосов
/ 02 августа 2009

(Просто чтобы позволить вам сейчас, я учусь разрабатывать для iPhone книгу, которую я получил под названием «Начало разработки для iPhone 3: исследую SDK, и я не использую Интерфейсный конструктор») Есть ли причина использовать геттер в том же классе, когда виден закрытый член? Как в Foo.h, имея

NSObject *myObj;
...
@property (nonatomic, retain)NSObject *myObj;

и затем в Foo.m доступ к члену myObj с помощью self.myObj (или [self myObj])? Потому что в моей книге, вот что говорит вам написать в одном из приложений (проверяется, находится ли представление члена UIViewController в суперпредставлении):

if(self.yellowViewController.view.superview == nil) {

(обратите внимание на self .yellowViewController ...) Есть ли на самом деле причина для этого? Если у меня нет единой идеи, может быть потому, что член blueViewController принадлежит к классу BlueViewController, поэтому я думаю, что если нет причин, это может привести к путанице. Так есть ли когда-нибудь, где необходимо использовать геттер в том же классе?

Спасибо !!

Ответы [ 3 ]

2 голосов
/ 02 августа 2009

Загрузчик с отложенной загрузкой:

- (UIImageView*) getImageView
{
    if (!imageView)
    {
        imageView = [[UIImageView alloc] initWithImage: [UIImage imageNamed: @"blah.png"]]; // just an example
    }
    return imageView;
}

В зависимости от того, как определяется imageView (копировать, назначать, сохранять), вам потребуется изменить фактическое назначение, но это то, что подразумевается под отложенной загрузкой.

1 голос
/ 03 августа 2009

Несколько причин использовать синтаксис get self.ivar вместо прямого доступа к переменной экземпляра:

  • свойства Lazy-loading, как уже упоминали другие
  • Подклассы могут захотеть переопределить свойство и иметь суперкласс с уважением, что
  • Если вы используете атомарные свойства, единственный правильный способ доступа к свойству - через геттер
1 голос
/ 02 августа 2009

Да, получить доступ к вашим иварам через геттер, а не напрямую, - это хорошо.

В качестве примера: один из обычных шаблонов проектирования в Какао (особенно на телефоне, где ресурсы очень ограничены) называется отложенной загрузкой.

Подводя итог, это означает, что не загружайте ресурс, пока он вам не понадобится.

В идеале вы хотели бы поместить код в ваш геттер, который проверял бы, загружен ли запрашиваемый ресурс, и, если нет, загружать его. Прямой доступ к ivar просто вернет ноль. Альтернативой может быть инициализация всех ivars при инициализации родительского класса, что может привести к бесполезной трате ресурсов на хранение данных, которые могут понадобиться или не потребоваться.

Это также позволяет вам потенциально размещать ресурсы, которые потенциально могут быть снова получены, в ваших applicationDidReceiveMemoryWarning: методах и выгружать их при нехватке ресурсов, потому что они будут загружаться снова по требованию при необходимости.

...