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。