黑马程序员技术交流社区

标题: Objective-C中一些 值得程序员注意的地方[2] [打印本页]

作者: ZXY66452    时间: 2015-12-2 21:47
标题: Objective-C中一些 值得程序员注意的地方[2]

第4章节:

1.继承:~~@interface Circle: NSObject~~冒号后的标识是需要继承的类,因为可以从非类中继承对象.Cocoa,NSObject继承对象,因为NSObject提供了大量有用的特性(当继承一个已继承自NSOvhect的类时,你也能获取这些特性).Objective-C中继承不支持多继承,想在Objective-C中获得多继承的优点,那么就要使用Objective-C的其他特性,如:分类和协议,在本书12、13章有介绍.

2.重构:移动和简化代码的方式称为重构,这在OOP社区中是一个非常时尚的话题.进行重构时,你通过移动某些代码来改进程序的架构,正如我们在这里把程序中重复代码删除,而不改变代码的行为或运行结果一样,通常的开发周期包括想代码中添加某些特性,然后通过重构删除所有的重复的代码.通常,在面向对象的程序中添加某些新特性后,程序反而变得更简单,你可能对此觉得很奇怪,这就想我们添加了Shapes类后所出现的情况.

说明:因为继承在子类和超类只见建立了一种"is a"(是一个)关系,所以NSObjec的实例变量称为isa.即Rectangle是一种Shape,Circle是一种Shape,使用Shape的代码也可以使用Rectangle或Circle来代替.使用更具体种类的对象(Rectangle或Circle)代替一般类型(Shape),这种能力称为多态性(polymorphism),它在希腊语中形象地表示"很多形状".

小心易碎:编译器使用"基地址加偏移"机制实现奇妙的功能.给定的对象基地址,是指第一个实例变量的首个字节在内存中的位置.通过在该地址加上偏移地址,编译器就可以查找其他实例变量的位置.如:如果圆角矩形对象的基地址是0x1000,则isa实例变量的地址是0x1000+0,即位于0x1000位置,isa的值占4个字节,因此,下一个实例变量fillColor的起始地址位于4个偏移地址之后,即位于0x1000+4位置,或写作0x1004,,每个实例变量与对象的基地址都有一个偏移位置.如果访问方法中的fillColor实例变量,编译器生成代码并得到存储self的位置值,然后加上偏移值(在本例中为4),得到指向存储变量值的位置.随着时间的推移,这也回产生一些问题,现在,在编译器生成的程序中,这些偏移位置是通过硬编码实现的.尽管苹果公司的工程师希望向NSObject中添加其他的实例变量,但他们无法做到,因为这样做会改变所有实例变量的偏移位置.这被称为脆弱的基类问题(fragile base class problem).通过在Leopard中引入新的64位Objective-C运行(它使用间接寻址方式确定变量的位置),苹果公司解决了这个问题.

3.重写方法:有时候为了在类中引入某个独特的特性,需要添加新方法.还有时候可能需要替换或增强由这个新类的某个超类所定义的现有方法.(使某方法为空,当方法中的子类都各自实现了自己的功能方法时,就说方法实现了重写).涉及关键字有:super(超类)。

说明一点:重写方法时,调用超类方法总是一个不错的选择,这样可以实现更多的功能.通过用调用super来实现机会,这样可以 保证能够获得方法的所有特性。

第5章节:

1.什么是复合:将多个组建组合在一起配合使用,从而得到完整的作品.这里需要注意的一点是:从严格上来讲,只有对象间的组合才能叫做复合,诸如int,float,enum和struct等基本类型都被认为是对象的一部分.

提醒:如果类中没有包含人和实例变量,就可以省去代码中的花括号。

需要记住的有:通过NSLog()可以使用%@格式说明符来输出对象.NSLog()处理%@说明符时,它会询问参数列表中相应的对象以得到这个对象的描述.从技术上说,就是NSLog()给这个对象发送描述消息,然后对象的description方法生成一个NSString并返回.之后NSLog()在其输出中包含这个字符串.在类中添加description方法就可以自定义NSLog()如何输出对象.
2.存取方法:存取方法(accessor method)是用来读取或改变对象特定属性的方法。类存取方法称为setter方法。另外一种存取方法就getter方法。getter方法为使用对象的代码提供了读取对象属性的途径。

3.修改方法(mutator)是用来改变对象状态的方法。需要说明的一点:在其对象的属性进行操作时,应该始终使用对象所提供的存取方法,永远不要直接改变其对象属性的数值。存取方法是程序间接工作的另一个例子。

4.防御式编程:在存取方法中使用通用代码来检查实例变量的数组索引,以保证它是有效数值,若是超出了有效范围,那么程序就会输出错误信息并且退出,那么该段代码就是所谓的防御式编程.(编程者需要考虑种种可能出现的问题,并且设置异常抛出机制,引申到编程者换位思考的问题上,就可发现出程序所欠缺的部分待优化的功能)。
注意:继承的适用范围,切记不要用复杂的系统来继承包含在本系统中的模块,如:简单来说父与子的血脉继承关系是单向的,所以继承也需要考虑适用范围问题。


第7章节-深入了解Xcode:
1.使用编辑器的技巧与诀窍:

Xcode会在开发者键入代码法过程中给出建议,这是Xcode的代码提示功能,通常叫做代码自动完成功能.

Xcode中的快捷键:command键加上“[”、“]”两个键的功能是把当前光标位置的一行代码进行整体左移跟整体右移。command键加上“/”则为把当前光标位置的一行代码进行行注释。

2.括号匹配:输入程序代码时,也许在输入了某些字符(如")"、"]"或"}")后屏幕会有些闪烁,这就是Xcode在告诉在这里与之对应的开括号在哪里.这就是Xcode的"括号匹配",也可以双击某个分隔符,Xcode会选定它以及与它匹配的括号之间的全部代码.

3.批量编辑:选择File->Make Snapshot(快捷键command-control-S),Xcode会记住项目的当前的状态.先在你就可以随心所欲的"破坏"你的项目.如果意识到犯了一个很严重的错误,那么可以通过File->Snapshots来恢复你的快照.在这里若是要做什么项目上的重大的修改的时候都推荐备份一份代码跟保留一份修改当前一个完整版本的代码快照.(说明:备份代码的重要性,因为在实际上快照被存储在一个磁盘镜像中,它存放于~/Library/Application Support/Developer/Shared/SnapshotRepository.sparseimage.有时候这个磁盘镜像可能会被损坏(也许因为生活压力太大了),这时Xcode会向你报告一个“神秘”的错误:Snapshot Failed:A project snapshot cannot be created.如果开发者看到了这样的错误,请尝试删除这个景象并重新启动).
4.Xcode中的查找与替换功能:此功能在子菜单Edit->Find中.里面有几个非常方便的选项.Find in Project可以在项目的所有文件里进行查找和替换.其实这种查找与替换工作并不是很好使用,如:若是开发者只是想重命名函数中的变量,那么它做了过多的操作(因为它可能会改变整个文件中的变量名称),而开发者想重命名一个类时,它又无法办到,另外重要的一点,它不能重命名源文件.<在这里又有两个功能可以弥补这些不足:1.可以简称为Edit all in scope,开发者可以选定一个符号,如局部变量或参数,然后选择Edit->Edit all in Scope,然后在开发者输入时,所有该符号出现的地方都会立即更新,这不但是进行大量改动的快捷方式,而且操作是看起来很"酷",输入完毕之后,只要在源文件编辑窗口单击其他地方,就会离开Edit all in Scope模式。2.“内置重构工具”,若开发者有一个GUI程序,它甚至能够深入到nib文件的层次进行修改操作,在需要修改的文件中设置插入点,然后选择Refactor,为了保险需要确保Snapshot复选框被选中,单击Preview之后,Xcode会分析出要做什么,并将结果展示出来.可惜的是,重构并不能重命名注释中的文字,所以类末注释、Xcode生成的头文件注释或者任何开发者编写的文档注释都需要手工编辑,开发者可以使用查找和替换功能来简化这一过程.




作者: 、Z    时间: 2015-12-2 23:32
貌似我们的基础班没有讲到复合这里啊。。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2