《Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法》(第十四条:理解“类对象”的用意)笔记
要点如下:
1、对象类型要在运行期查找,并非在编译期就绑定好
2、根据第12条知道,编译器无法知道某类型对象能处理多少方法
3、OC对象实例都是指针(*),所以存在堆里,不带 * 的会存栈中
4、OC对象结构体:
id类型的结构体(注意:id已带 * 号):
typedef struct objc_object{ Class isa;(指向变量所属的类) } *id;
其中isa是Class对象(类对象),Class的结构体为:
typedef struct objc_class *Class;(类对象) struct objc_class{ Class isa;(指向元类) Class super_class; const char *name; long version; long info; long instance_size; struct objc_ivar_list *ivars; struct objc_method_list *methodLists; struct objc_cache *cache; struct objc_protocol_list *protocol; }
此结构体首个变量也是isa指针,说明Class也是OC对象,即类对象;
一个类仅有一个类对象,即类对象是单例;
Class结构体中的isa指针指向“元类”,里面放着“类方法”;