iOS 类本质

Objective-C代码,底层实现其实都是C\C++代码。

使用基本代码验证对象是什么:

oc代码:

int main(int argc, const char * argv[]) {

@autoreleasepool {

    // insert code here...

NSObject *obj=[[NSObject alloc]init];

    NSLog(@"Hello, World!");

}

return 0;

}

编译后的代码:

int main(int argc, const char * argv[]) {

/* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool;

  NSObject *obj=((NSObject *(*)(id, SEL))(void *)objc_msgSend)((id)((NSObject *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("NSObject"), sel_registerName("alloc")), sel_registerName("init"));

    NSLog((NSString *)&__NSConstantStringImpl__var_folders_c0_7nm4_r7s4xd0mbs67ljb_b8m0000gn_T_main_1b47c1_mi_0);

}

return 0;

}

其实我们Object-C编译之后对象会编译成结构体

struct NSObject_IMPL {

Class isa;

};


1

那么isa是什么吗?

typedef struct objc_class *Class;

class其实是一个指向结构体的指针,然后com+点击class得到:

struct objc_class {

    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__

    Class _Nullable super_class                              OBJC2_UNAVAILABLE;

    const char * _Nonnull name                              OBJC2_UNAVAILABLE;

    long version                                            OBJC2_UNAVAILABLE;

    long info                                                OBJC2_UNAVAILABLE;

    long instance_size                                      OBJC2_UNAVAILABLE;

    struct objc_ivar_list * _Nullable ivars                  OBJC2_UNAVAILABLE;

    struct objc_method_list * _Nullable * _Nullable methodLists                    OBJC2_UNAVAILABLE;

    struct objc_cache * _Nonnull cache                      OBJC2_UNAVAILABLE;

    struct objc_protocol_list * _Nullable protocols          OBJC2_UNAVAILABLE;

#endif

} OBJC2_UNAVAILABLE;

class是一个指针,那么占用多少内存呢?大家都知道指针在32位是4字节,在64位是8字节。

NSObject *obj=[[NSObject alloc]init];

可以理解成实例对象是一个指针,指针占用8或者4字节,那么暂时假设机器是64位,记为对象占用8字节。 obj就是指向结构体class的一个指针。 那么我们来验证一下:

int main(int argc, const char * argv[]) {

@autoreleasepool {

    // insert code here...

NSObject *obj=[[NSObject alloc]init];

//获得NSobject对象实例大小

size_t size = class_getInstanceSize(obj.class);

//获取NSObjet指针的指向的内存大小

//需要导入:#import

size_t size2 = malloc_size((__bridge const void *)(obj));

NSLog(@"size:%zu size2:%zu",size,size2);

}

return 0;

}

得出结果是:

size:8 size2:16

结论是:指针是8字节,指针指向的的内存大小为16字节。 查看源码得知[[NSObject alloc]init]的函数运行顺序是:


类的本质:结构体

类的结构:isa,superclass,cache,bits

类的属性方法:

你可能感兴趣的:(iOS 类本质)