Objective C继承和面向对象的原则

时间:2022-10-11 11:29:33

许多iPhone程序员不喜欢IB,他们坚持只使用Xcode编写App。相比较更图形化的IB,用“纯代码方式”编写应用程序无疑要困难得多。那么,程序员们避易就难是为什么呢?这并不是因为程序员普遍存在的所谓“代码情结”的问题,而是苹果提供的Interface Builder工具确实存在着许多问题,比如不支持自定义组件,不支持插件编程(指iOS)。

但这些都不是最大的问题。最大的问题在于,xib对象违反了面向对象的原则,你无法继承一个xib对象。

我们用纯代码编写的对象,通过类的继承关系,可以很方便地重用代码。而使用IB的话,你无法做到这一点。你很辛苦地在IB里设计了一个View Controller,而且为它编写了许多代码。你想在子类中扩展它,那么你必须注意一些问题。

1、在代码中声明继承,而不是在IB中设置属性。保持这样的观念:xib对象只是持久化对象,而永远不可能是真正的类。

2、如果你要改变xib文件,那么请使用新的xib文件拷贝。

3、如果你需要做自定义的初始化动作,请重载initWithNibName:bundle:方法,并确保调用了[super initWithNibName:bundle:]方法。

4、父类方法代码中引用到的xib对象,必须用“self.属性名”的方式引用,不要直接以“属性名”的方式引用,否则属性指向的是父类的xib对象,而不是子类的xib对象。

5、父类方法中引用到的成员变量,直接用“属性名”而不是“self.属性名”的方式引用。

6、父类中,对于属性别名,必须使用“self.属性名”的方式引用,不能以“属性别名”的方式引用。

7、如果子类使用不同的xib文件,则所有的IBOutlet必须重新声明并连接。因为IB不会自动连接和共用父类的代码。

8、如果你重新声明了IBAction,则你可以不用实现动作,默认会使用父类已实现的action。如果你想实现不同的动作,你必须覆盖action 。

可以看到,在包含有xib对象的继承当中,需要注意的地方非常多,也许还不止上面列出的那些。我在一个项目中曾经试图继承一个用IB构建的View Controller,发现最终的结果还是不得不重新实现所有的父类方法。

因此,在使用了IB之后,我们就很少能体会到面向对象的好处了——这才是程序员在某些情况下拒绝使用IB的真正原因。