在init期间,在处理来自超类的属性时,有没有办法避免消息传递自身?

时间:2013-09-23 01:55:37

标签: ios objective-c oop

我已经读过你不应该在初始化期间向'self'发送消息。不幸的是,你不能直接访问属于你的超类的ivars(据我所知)。这导致您需要以某种方式访问​​/设置超类ivar,但除了消息传递self之外没有办法这样做。 (作为参考,我正在编写自定义UIControl来封装我的应用程序中的重复概念;虽然很多逻辑是共享的,因此属于超类,每个控件的确切布局需要变化)。

例如,自定义控件需要有一个按钮。取决于所讨论的子类,该按钮与视图中的每个其他对象相比排列不同,因此我需要引用它来进行布局。据我所知,与ViewControlllers不同,UIViews没有任何回调让你知道像'willAppear'或'didLoad'这样的生命周期事件; init是唯一放置代码的地方 - 我读过的关于创建自定义UIControls的教程也将它放在那里。

我是否误解了某些内容,或者我没有选择在我的方案中违反有关消息传递自我的规则? (或者创建一个额外的方法,必须在init之后调用...创建一个新的约定,基本上是'首先你初始化,然后你真的初始化'!)

1 个答案:

答案 0 :(得分:1)

  

不幸的是,您不能直接访问属于您的超类的ivars(据我所知)

仅在基类声明ivars @private的情况下。如果没有,您可以使用->上的self运算符访问ivars,如下所示:

self->myBaseIntVar = 123;

默认情况下,ivars具有@protected访问权限,因此您应该能够访问它们,除非您的超类的设计者通过指定私有访问权特别撤回了这种可能性。

  

我是否误解了某些内容,或者我别无选择,只能在我的方案中违反有关消息传递的规则?

另一种选择是将值传递给基类的指定初始值设定项:

-(id)init {
    if (self = [super initWithSomeProperty:123]) {
    }
    return self;
}