objective-C编程 对象的类型和动态绑定摘要

来源:互联网 发布:js 12.7mm狙击步枪 编辑:程序博客网 时间:2024/04/28 06:01

Objective-C中的消息是在运行时采取绑定。运行时系统首先会确定接受者的类型(动态类型识别),然后根据消息名在类的方法列表中选择相应的方法执行,如果没有找到就到父类中继续寻找,假如一直找到NSObeject也没有找到调用的方法,就会报告不能识别消息的错误。

动态绑定(dynamic binding)指的就是在程序执行时才确定对象的属性和需要响应的消息。

1.多态

同一操作作用于不同的类的实例时,将产生不同的执行效果。即不同类的对象收到相同的消息时,也能得到不同的结果。

2.空指针nil

nil是指向id类型的指针,值为0。

如果给nil变量发送消息时,运行不会有任何作用,消息也不会被发送。

3.#import和@class

#import是引入头文件,但是可能头文件中还引入了其他类的头文件,如此循环会大大加大编译时的负担。如果仅仅是在类型定义的时候使用一下类名,则可以用@class(前置声明

通过使用@class可以提升程序整体的编译速度。但是要注意的是,如果新定义的类中要使用原有类的具体成员或方法,就一定要引入原有类的头文件。

4.强制类型转换

强制类型转换的功能很强大,但会让编译器的类型检查变得没有意义,所以要尽量少用。不得不使用的情况下,要重新思考设计是否合理。

5.实例变量的可见型

@private:只能在声明它的类内访问,子类中不可以访问,可以在方法里通过->来访问同一个类的实例对象。

@protected:能够被声明它的类和任何子类访问。类方法中可以通过->来访问本类的实例对象的实例变量。没有显式指定可见性的实例变量都是此属性。

@public:作用范围最大,本类和其他类都可以直接访问。

@package:类所在的框架内,可以像@public一样访问。而框架外则同@private一样,不允许访问。

6.类对象

类对象的类型可以用id和class来表示。

类方法class可以获取类对象,例如class theClass = flag ? [volume class] : [MuteVolume class];

判断调用方法的对象是否是该类的成员。

BOOL isMember = [someobj isMEmberOfClass : [Volume class]];

实例方法Class,所有的实例对象都可以使用Class实例方法,这个方法返回的是对象所属类的类对象。

7.类方法

1.类方法中不能访问类中定义的实例变量和实例方法。因为类对象只有一个,类的实例对象可以有任意个,若果类对象可以访问实例变量,就会分不清楚访问的到底是哪个实例对象的变量。

2.类方法在执行时用self代表了类对象自身,因此可以通过给self发送消息的方式来调用类中的其他类方法。同实例方法一样,也要注意self实际指向的类。

3.调用父类的类方法时,可以使用self。



0 0