今天在学习中,看到这样一个语法:
Test *t = [[Test alloc]init];
t->_next = @"next";
引发了我一个思考,oc的对象可以使用->访问成员变量,那么,oc中对成员变量的处理是怎么样的呢,是否是底层封装的结构体呢?
带着这个思考我查阅了一些文章。下面是关于 “.”语法和“->”语法的比较:http://www.tuicool.com/articles/r6nuIz7,文章浅显易懂,可作为初步的理解。
在查看NSObject类时我们可以看到这样的描述:
@interface NSObject <NSObject> {
Class isa OBJC_ISA_AVAILABILITY;
}
表明NSObject类中包含Class类型的成员变量,而,Class又是typedef struct objc_class *Class;的结构体
在深入objc_class我们可以知道objc_class的结构如下:
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;
meta-class是类对象的类,每个类都有自己单独的meta-class。所有的类对象并不会属于同一个meta-class。所有的meta-class使用基类的meta-class作为自己的基类,对于顶层基类的meta-class也是一样,只是它指向自己而已。
另外,在结构体中存在objc_ivar_list,objc_method_list,objc_protocol_list,objc_cache,从字面即可理解,他们分别是记录变量,方法,协议,缓存的结构体。
所以,最终oc的变量会被存储成结构体的形式存储起来,那么“->”语法的存在就容易理解了。