Objective-C点语法和Init

Objective-C点语法和Init,objective-c,syntax,Objective C,Syntax,我读过很多片段,其中提到在init或dealloc方法中不应该使用点表示法。然而,我似乎永远也找不到原因。一篇帖子顺便提到它与KVO有关,但仅此而已 @interface MyClass : NSObject { SomeObject *object_; } @property (nonatomic, retain) SomeObject *object; @end 这个实现很糟糕 @implementation MyClass @synthesize object = objec

我读过很多片段,其中提到在init或dealloc方法中不应该使用点表示法。然而,我似乎永远也找不到原因。一篇帖子顺便提到它与KVO有关,但仅此而已

@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中使用点表示法有哪些缺陷?

我听到的原因主要是由于编写自己的setter/getter时出现的。当使用这些方法的默认@synthesized版本时,不会引起太多问题。不过,当您编写自己的setter时,它通常会对您的类产生副作用。这个副作用在init中可能不需要,如果它引用了其他尚未创建的ivar,甚至会导致问题。dealloc中也存在同样的问题,如果你有副作用,它可能会爆炸。

首先,它不是点符号,而是你不应该使用的访问器

self.foo = bar;
与相同

在init/dealoc中,它们都是不受欢迎的


主要原因是子类可能重写您的访问器并执行不同的操作。子类的访问器可能假设一个完全初始化的对象,即子类的init方法中的所有代码都已运行。事实上,当您的init方法正在运行时,它没有任何一个。类似地,子类的访问器可能依赖于未运行的子类的dealloc方法。当dealloc方法正在运行时,这显然是错误的。

在第二个示例中,似乎应该编写object_=[object retain];修复了快速编写示例的问题。;)不管是谁投了反对票,请解释一下他们为什么这么做?
[self setFoo: bar];