Приложение не работает на устройстве - я не могу вызвать класс атрибута из его подкласса без использования self.attribute - PullRequest
0 голосов
/ 08 сентября 2011

Если у меня есть класс (MyClass) с атрибутом myAttribute, я не могу использовать его в подклассе (MySubclass) без вызова self.myAttribute.У меня нет проблем с такого рода кодом при запуске приложения с симулятором.Вам может быть интересно: «Зачем она это делает?».Это довольно легко добавить «я» везде.Проблема в том, что в MySubclass я переопределяю некоторые методы доступа MyClass.Вот пример:

- (NSDateFormatter *)dateFormatter
{
    if (dateFormatter == nil)
    {
        dateFormatter = [[NSDateFormatter alloc] init];
        // Do other stuff with the dateFormatter
    }

    return dateFormatter;
}

Я не могу вызвать self.dateFormatter внутри геттера, потому что это создаст бесконечный цикл.Я могу реорганизовать свои занятия для решения этой проблемы, но это может быть хорошим и простым решением для решения этой проблемы.

Спасибо!

1 Ответ

1 голос
/ 08 сентября 2011

Вы должны помнить, что self.property - это то же самое, что и [self propertyGetter].

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

Лучший способ - всегда предварительно представлять общий префикс для ivars.

@interface MyClass {
  // You don't have to declare iVar. Feel free to remove line.
  NSDateFormatter * iVarDateFormatter;
}

@property (retain) NSDateFormatter * dateFormatter;

@end

А при реализации

@implementation MyClass
@synthetize dateFormatter= iVarDateFormatter;
...
@end

Итак, вы можете написать:

- (NSDateFormatter *) dateFormatter
{
    if ( nil == iVarDateFormatter )
    {
        iVarDateFormatter = [[NSDateFormatter alloc] init];
        // Do other stuff with the dateFormatter
    }

    return iVarDateFormatter;
}

Еще лучше для одноэлементных объектов, таких как этот, используйте GCD dispatch_once!

- (NSDateFormatter *) dateFormatter
{
    static dispatch_once_t pred;

    dispatch_once(& pred, ^{
        iVarDateFormatter = [[NSDateFormatter alloc] init];
        // Do other stuff with the dateFormatter
    });

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