欢迎来到天天文库
浏览记录
ID:58804949
大小:172.50 KB
页数:65页
时间:2020-10-02
《学习Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法 第二章对象 消息 运行期ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第二章对象、消息、运行期第二章对象、消息、运行期用Objective-C等面向对象语言编程时,“对象”就是“基本构造单元”,开发者可以通过对象来存储并传递数据。在对象之间传递数据并执行任务的过程就叫做“消息传递”。若想编写出高效且易维护的代码,就一定要熟悉这两个特性的工作原理。当应用程序运行起来以后,为其提供相关支持的代码叫做“Objective-C”运行期环境,它提供了一些使得对象之间能够传递消息的重要函数,并且包含创建类实例所用的全部逻辑。在理解了运行期环境中各个部分协同工作的原理之后,你的开发水平会进一步的提升。第6条:理解“属性”这一感
2、念“属性”是Objective-C的一项特性,用于封装对象中的数据。Objective-C对象通常会把其它所需要的数据保存为各种实例变量。实例变量一般通过“存取方法”来访问。其中,“获取方法”用于读取变量值,而“设置方法”用于写入变量值。这个概念已经定型,并且经由“属性”这一特性而成为Objective-C2.0的一部分,开发者可以令编译器自动编写与属性相关的存取方法。此特性引入了一种新的“点语法”,使开发者可以更为容易地依照类对象来访问存放于其中的数据。你也许已经使用过“属性”这个概念了,不过你未必知道其全部细节。而且,还有很多与属性有关的麻
3、烦事。第6条将会告诉大家有哪些问题可以用属性来解决,并指出其中所提现出来的关键特性。在描述个人信息的类中,也许会存放人名、生日、地址等内容。可以在类接口的public区段中声明一些实例变量。@interfaceEOCPerson:NSObject{@publicNSString*_firstName;NSString*_lastName;@privateNSString*_someInternal;}@end原来编过java或C++程序的人应该比较熟悉这种写法,在这些语言中,可以定义实例变量的作用域。然而编写Objective-C代码时却很少这
4、么做。这种写法的问题是:对象布局在编译期就已经固定了。只要碰到访问——firstName变量的代码,编译器就把其替换为“偏移量”,这个偏移量是“硬编码”,表示该变量距离存放对象的内存区域的起始地址有多远。这样做目前看没问题,但是如果又加了一个实例变量,那就麻烦了。比如说,假设在_firstName之前又多了一个实例变量@interfaceEOCPerson:NSObject{@publicNSDate*_dateOfBirth;NSString*_firstName;NSStrinig*_lastName;@privateNSString*_s
5、omeInternalData;}@end原来表示_firstName的偏移量现在却指向_dateOfBirth了。把偏移量硬编码于其中的那些代码都会读到错误的值。图2-1演示了此情况,请对比在类中加入_dateOfBirth这以实例变量之前与之后的内存布局,其中假设指针为4个字节。Person+0_firstName+4_lastName+8_someInternalDataPerson+0+4_firstName+8_lastName+12_someInternalData如果代码使用了编译期计算出来的偏移量,那么在修改类定义之后必须重新编
6、译,否则就会出错。例如,某个代码库中的代码使用了一份旧的类定义。如果和其相链接的代码使用了新的类定义,那么运行时就会出现不兼容现象。各种编程语言都有应对此问题的方法。Objective-C的做法是,把实例变量当作一种存储偏移量所用的“特殊变量”,交由“类对象”保管。偏移量会在运行期查找,如果类的定义变了,那么存储的偏移量也就变了,这样的话,无论何时访问实例变量,总能使用正确的偏移量。甚至可以在运行期向类中新增实例变量,这就是稳固的“应用程序二进制接口ABI”.ABI定义了许多内容,其中一项就是生成代码时所应遵循的规范。有了这种“稳固的”ABI,
7、我们就可以在“class-continiation分类”或实现文件中定义实例变量了。所以说,不一定要在接口中把全部实例变量都声明好,可以将某些变量从接口的public区段移走,以便保护与类实现有关的内部信息。这个问题还有一种解决办法,就是尽量不要直接访问实例变量,而应该通过存取方法来做,虽说属性最终还是得通过实例变量来实现,但它却提供了一种简洁的抽象机制,你可以自己编写存取方法。然而在正规的Objective-C编码风格中,存取方法有着严格的命名规范。正因为有了这种严格的命名规范,所以Objective-C这门语言才能根据名称自动创建出存取方法
8、。这时@property语法就派上用场了。在对象接口的定义中,可以使用属性,这是一种标准的写法,能够访问封装在对象里的数据。因此,也可以把属性当做一种
此文档下载收益归作者所有