iPhone Dev - Использование средства получения в том же классе

StackOverflow https://stackoverflow.com/questions/1217979

Вопрос

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

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

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

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

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

Спасибо!!

Это было полезно?

Решение

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

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

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

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

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

Другие советы

Устройство для получения отложенной загрузки:

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

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

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

  • Свойства отложенной загрузки, как упоминали другие
  • Подклассы могут захотеть переопределить свойство и заставить суперкласс уважать это
  • Если вы используете атомарные свойства, единственный правильный способ получить доступ к свойству - это через геттер
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top