[关闭]
@PEND 2019-05-09T08:23:21.000000Z 字数 1715 阅读 480

OC类与对象

iOS


对象类型



内存布局

  1. /*
  2. * 储存
  3. * 1.isa指针
  4. * 2.成员变量的值
  5. */
  6. NSObject *object = [[NSObject alloc] init];
  1. /*
  2. * 储存:
  3. * 1.isa指针
  4. * 2.superclass指针
  5. * 3.属性信息
  6. * 4.对象方法信息
  7. * 5.协议信息
  8. * 6.成员变量信息
  9. */
  10. Class objectClass = [object class];
  11. Class objectClass = object_getClass(object);
  12. Class objectClass = [NSObject class];
  1. /*
  2. * 储存:
  3. * 1.isa指针
  4. * 2.superclass指针
  5. * 3.类方法信息
  6. */
  7. Class objectMetaClass = object_getClass([NSObject class]);

获取对象的方式

底层结构

1.首先,在 NSObject.h 文件中我们可以看到如下信息

  1. @interface NSObject <NSObject> {
  2. Class isa OBJC_ISA_AVAILABILITY;
  3. }

2.将 main.m 通过 clang 工具编译为 C++ 代码

  1. // 编译命令(指定arm64指令集)
  2. xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp
  3. // main.m
  4. #import <Foundation/Foundation.h>
  5. int main(int argc, const char * argv[]) {
  6. @autoreleasepool {
  7. NSObject *objc = [[NSObject alloc] init];
  8. }
  9. return 0;
  10. }
  11. // main-arm64.cpp
  12. typedef struct objc_object NSObject; // NSObject 是 struct objc_object 结构体的别名
  13. struct NSObject_IMPL {
  14. Class isa; // isa 指针
  15. // 成员变量
  16. };
  17. // 如果存在继承关系
  18. Person:NSObject
  19. @property (nonatomic,assign) int i;
  20. typedef struct objc_object Person;
  21. struct Person_IMPL {
  22. struct NSObject_IMPL NSObject_IVARS; // NSObject
  23. int _i; // 成员变量
  24. };

3.接下来需要了解 Class 和 struct objc_object 的实现,进runtime源码

  1. // objc.h
  2. /// 表示Objective-C类的不透明类型。
  3. typedef struct objc_class *Class;
  4. /// 表示类的实例。
  5. struct objc_object {
  6. Class isa OBJC_ISA_AVAILABILITY;
  7. };
  8. // objc-runtime-new.h
  9. struct objc_class : objc_object {
  10. // Class ISA;
  11. Class superclass;
  12. cache_t cache;
  13. class_data_bits_t bits;
  14. // ...
  15. }
  16. // objc-private.h
  17. struct objc_object {
  18. private:
  19. isa_t isa;
  20. public:
  21. // ...
  22. }

4.内部结构


5.总结

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注