美文网首页
iOS 类本质

iOS 类本质

作者: 小暖风 | 来源:发表于2020-12-27 12:15 被阅读0次

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 <malloc/malloc.h>

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 类本质

    Objective-C代码,底层实现其实都是C\C++代码。 使用基本代码验证对象是什么: oc代码: int m...

  • IOS底层(二) Class的本质

    @[TOC](IOS Class的本质) Class的本质 我们知道不管是类对象还是元类对象,类型都是Class,...

  • Objective-c isa、superclass指针深究,元

     研究iOS isa指针本质需要要了解类的本质和结构,我们都知道iOS的对象基本都是基于NSObject的子类。我...

  • iOS类的本质

    1.类的本质 类的本质其实也是一个对象(类对象)程序中第一次使用该类的时候被创建,在整个程序中只有一份。此后每次使...

  • iOS类的本质

    首先,我们看下几个类型:NSObject、Class、objc_object、objc_class、id的联系与区...

  • 探寻Class的本质

    iOS底层原理总结 - 探寻Class的本质 Class的本质 我们知道不管是类对象还是元类对象,类型都是Clas...

  • OC对象的本质(上)

    iOS | OC对象本质 | Objective-C 什么是OC语言,OC对象、类的本质是什么,OC对象的内存布局...

  • iOS 中类的本质

    通过对上述代码使用clang -rewrite-objc解析后,可以得到如下信息: _ivar_t结构体指针,里面...

  • iOS类本质探究(一)

    我们先来解释一下苹果官方给开发者提供的这张图 例如我们创建个自己的类 LWPerson *person = [[...

  • iOS底层探索之类的结构(上)

    回顾 在之前的几篇博客里面,我们知道了对象的本质是结构体(iOS底层探索之对象的本质和类的关联特性initIsa(...

网友评论

      本文标题:iOS 类本质

      本文链接:https://www.haomeiwen.com/subject/scronktx.html