实例对象与类对象简单总结
1.什么是对象?(实例对象)
苹果官方是这样定义的:
struct objc_object { Class isa OBJC_ISA_AVAILABILITY; };
这里可以这么解释,对象是一种结构体,是一种含有isa指针的结构体。
只要含有isa指针的结构体,就是对象。(这里最好是只含有isa指针的结构体),对象变量也可以说是一种结构体变量。2.什么是id?
苹果官方是这样定义的:
typedef struct objc_object *id;
id是一种指针,是一种指向对象的指针。(严格的说是一种指针类型,是一种指向对象的指针类型,它所定义的指针指向对象类型的变量,或者说是指向对象类型的结构体变量。)
3.什么是类?(类对象)
苹果官方是这样定义的:
struct objc_class {
Class isa OBJC_ISA_AVAILABILITY;
#if !OBJC2
Class super_class OBJC2_UNAVAILABLE;const char *name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
struct objc_cache *cache OBJC2_UNAVAILABLE;
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
#endif
} OBJC2_UNAVAILABLE;
类也是一种结构体,与对象结构比较,除了isa外它还有一些其他的属性。
最明显的是:super_class指针,类对象比实例对象多了一个super_class指针。如果在仔细观察,我们还会发现这四行代码:
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
struct objc_cache *cache OBJC2_UNAVAILABLE;
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
属性列表
方法列表
缓存列表(提高方法的命中率)
协议列表
4.什么是Class?
苹果官方是这样定义的:
typedef struct objc_class *Class;
看来Class也是一种指针,是一种指向类对象的指针。(严格的来说是一种指向类对象的指针类型。它所定义的指针变量指向类对象)