Синтаксис и инициализация точки Objective C - PullRequest
9 голосов
/ 30 июня 2010

Я прочитал несколько фрагментов, в которых упоминается, что вы никогда не должны использовать точечные обозначения в ваших методах init или dealloc. Тем не менее, я не могу понять, почему. В одном посте попутно упоминалось, что это имеет отношение к КВО, но не более.

@interface MyClass : NSObject {
    SomeObject *object_;
}
@property (nonatomic, retain) SomeObject *object;
@end

Эта реализация плохая?

@implementation MyClass 

@synthesize object = object_;

- (id)initWithObject:(SomeObject *)object {
    if (self = [super init]) {
        self.object = object;
    }

    return self;
}
@end

Но это хорошо?

@implementation MyClass 

@synthesize object = object_;

- (id)initWithObject:(SomeObject *)object {
    if (self = [super init]) {
        object_ = [object retain];
    }

    return self;
}
@end

Каковы ловушки использования точечной нотации внутри вашего init?

Ответы [ 2 ]

26 голосов
/ 30 июня 2010

Во-первых, это не точечная нотация, а средства доступа, которые вы не должны использовать.

self.foo = bar;

идентично

[self setFoo: bar];

и они оба недовольны в init / dealloc.

Основная причина в том, что подкласс может переопределить ваши методы доступа и сделать что-то другое. Средства доступа подкласса могут предполагать полностью инициализированный объект, то есть, что весь код в методе init подкласса был выполнен. Фактически, ничего из этого не имеет, когда ваш метод init работает. Точно так же методы доступа подкласса могут зависеть от выполнения метода подстановки подкласса , а не . Это явно неверно, когда ваш метод dealloc работает.

1 голос
/ 30 июня 2010

Причины, которые я слышал, в основном возникают из-за того, что вы пишете свои собственные сеттеры / геттеры. При использовании стандартных @synthesized версий методов это не вызовет особых проблем. Когда вы пишете свой собственный сеттер, это, как правило, будет иметь побочный эффект для вашего класса. Этот побочный эффект, вероятно, не нужен в init, или даже будет вызывать проблемы, если он ссылается на другие ivars, которые еще не были созданы. Та же проблема в сделке: если у вас есть побочный эффект, он может взорваться.

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