Objective-C编程全解(第3版)3.5 方法定义时的注意事项_Objective-C编程全解(第3版)3.5 方法定义时的注意事项试读-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > 编程 > Objective-C编程全解(第3版) > 3.5 方法定义时的注意事项

Objective-C编程全解(第3版)——3.5 方法定义时的注意事项

3.5.1 局部方法 实现接口声明中的方法时,可把具备独立功能的部分独立出来定义成子方法。一般情况下,这 些子方法都只供内部调用,不需要包含在类的接口中对外公开。 这种情况下,局部方法可以只在实现部分(通常是 .m 文件)中实现,而不需要在接口部分中进 行声明。这样一来,就算其他模块引用了接口文件,也无法获得这个方法的定义,无法调用这个方 法,从而就实现了局部方法。但这里只是说无法从接口中获得这个方法的定义,这个方法本身还是存在的,只要发送了消息,就能够执行。 让我们来看一个简单的例子,类 ClickVolume 是类 Volume 的一个子类,它的主要功能是当音量 发 生 变 化(提 高 或 降 低 )时 发 出 提 示 音。 提 高 或 降 低 音 量 时 发 出 提 示 音 使 用 一 个 共 同 的 方 法playClick, 定义如下所述。因为这个功能不会在其他地方使用到,所以我们把它定义成一个局 部方法,不在接口文件中声明。 @interfaceClickVolume:Volume -(id)up;//playClick 方法没有在这里声明 -(id)down; @end @implementationClickVolume -(void)playClick{//类内部定义的局部方法 /* 发出提示音 */ } -(id)up{ [selfplayClick]; return[superup]; } -(id)down{ [selfplayClick]; return[superdown]; } @end 未在接口中声明的局部方法和没有进行属性声明的 C 语言函数一样,只能被定义在局部方法之 后的方法调用。在上面的例子中,playClick就必须定义在up和down的前面。定义顺序方面出现的 问题,可以使用第 10 章介绍的“范畴”(category)来解决。 编程的时候使用局部方法可以增强程序的可维护性,但在继承的时候可能会出现问题。例如, 子类新追加的方法可能并不知道父类已经实现了局部方法而去重新实现一个父类的局部方法。 为了避免这一问题,苹果公司建议为局部方法名添加固定的前缀(详情请参考附录 C)。 3.5.2 指定初始化方法 前面已经介绍过了如何定义初始化方法,但还有一些要注意的地方。 根据需求有时可能需要为一个类定义多个不同的初始化方法。例如,既需要提供一个可指定每 个参数初始值的初始化方法,又需要提供一个每个参数都直接使用默认值的初始化方法;既需要提供 一个用内存变量进行初始化的初始化方法,又需要提供一个能从文件读入变量完成初始化的初始化 方法等。指定初始化方法(designatedinitializer)就是指能确保所有实例变量都能被初始化的方法, 这种方法是初始化的核心,类的非初始化方法会调用指定初始化方法完成初始化。通常,接收参数 最多的初始化方法就是指定初始化方法。 子类的指定初始化方法通常都是通过向 super 发送消息来调用超类的指定初始化方法。除此之外, 还有一些通过封装来调用指定初始化方法的方法叫作非指定初始化方法(secondaryinitializer)。图 3-8展示了指定初始化方法的概念,箭头指明了调用关系。图中每个类都只有一个指定初始化方法,实 际上也可以存在多个。 子类的指定初始化方法,必须调用超类的指定初始化方法。如图 3-8 中所示,按照类层次从底向 上,各个类的指定初始化方法会被连锁调用,一直到最上层的 NSObject 的指定初始化方法——init 为止。 如果子类中想重写父类中的指定初始化方法,就一定要调用父类的指定初始化方法,而不能调 用父类的非指定初始化方法。原因是非指定初始化方法内部会调用指定初始化方法,造成递归循环 调用,无法终止。 请看图 3-9 中的例子,类 A 的指定初始化方法是initWithMax:。init是类 A 的非指定初始 化方法。类 B 是类 A 的子类,在 B 中重写了指定初始化方法initWithMax:。initWithMax:中 调用了父类类 A 的 init。如图所示,如果类 A 的 init 中通过 self 调用了initWithMax:,那么,当 初始化对象是类 B 的实例时,就又会调用到类 B 的initWithMax:,这样就变成了一个递归循环, 调用永远无法结束。 再让我们回头看一下图 3-8,图 3-8 中类的非指定初始化方法都调用了指定初始化方法来进行初 始化,同时父类的非指定初始化方法也可以被继承,但定义的时候一定要注意,否则也会出现循环 调用的问题。 Objective-C 没有特殊的语法或关键字来表明哪个方法是指定初始化方法,所以通常需要通过 文档或注释来标明指定初始化方法。CocoaAPI 文档中的绝大多数类都标明了哪个方法是指定初始 化方法。

展开全文

推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读

《Objective-C编程全解(第3版)》其他试读目录

• 3.1 继承的概念
• 3.2 利用继承定义新类
• 3.3 使用继承的程序示例
• 3.4 继承和方法调用
• 3.5 方法定义时的注意事项 [当前]
• 专栏:Objective-C 与开源软件
• 19.1 多线程
• 19.2 互斥