0

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

例如,自定义控件需要有一个按钮。根据所讨论的子类,与视图中的其他对象相比,该按钮的排列方式不同,因此我需要参考它进行布局。据我所知,与 ViewControllers 不同,UIView 没有任何回调来让您了解诸如“willAppear”或“didLoad”之类的生命周期事件;init 是唯一放置代码的地方——我读过的关于创建自定义 UIControls 的教程也把它放在那里。

我是误会了什么,还是我别无选择,只能在我的场景中违反有关消息自我的规则?(或者创建一个必须在 init 之后调用的额外方法......创建一个新约定,基本上是说'首先你初始化,然后你真的初始化'!)

4

1 回答 1

1

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

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

self->myBaseIntVar = 123;

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

我是误会了什么,还是我别无选择,只能在我的场景中违反有关消息自我的规则?

另一种选择是将值传递给基类的指定初始化程序:

-(id)init {
    if (self = [super initWithSomeProperty:123]) {
    }
    return self;
}
于 2013-09-23T02:02:30.153 回答