为什么在Objective-C的初始化方法中使用self不是一个好的做法?

7 浏览
0 Comments

为什么在Objective-C的初始化方法中使用self不是一个好的做法?

我知道在dealloc中使用setter可能会导致问题,如果其他对象正在观察属性的更改。但为什么我们不应该在初始化程序中使用它们呢?

0
0 Comments

在Objective-C中,在初始化方法中使用self不是一个好的实践。这可能取决于在setter和getter方法中有多少魔法,如果这些访问器做了一些过于智能的事情,在初始化方法中使用它们可能会导致问题。

现在我想起来,我甚至在dealloc方法中使用访问器,同样也没有问题。如果有人正在观察一个对象,他应该确保对象首先不会被释放。

所以,除非有人提出一个有力的反驳意见,我认为你可以尝试在init和dealloc方法中都使用访问器,并看看对你是否起作用。

问题的原因:

- 初始化方法中使用self可能会导致访问器执行一些意想不到的操作,从而引发问题。

解决方法:

- 避免在初始化方法中使用self,可以直接访问实例变量来进行初始化操作。

- 在dealloc方法中使用访问器可能不会引发问题,但仍然需要谨慎处理,确保对象不会在观察期间被释放。

0
0 Comments

为什么在Objective-C的初始化方法中使用self不是一个好的做法?

在Objective-C中,使用self来调用访问器方法(accessor methods)并不是一个好的做法,因为对象可能还没有完全初始化,而访问器方法可能会依赖于对象的完整初始化。这种情况通常只会在子类覆盖了访问器方法时发生。

同样,在对象销毁时也存在一个对称的问题,如果覆盖的访问器方法依赖于不会部分销毁的对象被调用,那么这也是一个问题。此外,还存在可能发送不正确的KVO通知的问题。

这涉及到正确的封装(encapsulation)的核心。子类不应该关心超类的实现细节。

为了解决这个问题,可以在初始化方法中直接访问实例变量,而不是使用访问器方法。这样可以确保对象被完全初始化,避免依赖于可能尚未完成的初始化过程。

以下是一个示例代码,展示了如何在初始化方法中直接访问实例变量:

- (instancetype)init {

self = [super init];

if (self) {

_propertyName = defaultValue;

}

return self;

}

通过直接访问实例变量,可以避免使用访问器方法可能引发的问题,并确保对象的正确初始化。

0