01.Objective-C 对象 本质

2021-01-04  本文已影响0人  ProfessorFan

问题

  1. 将Objective-C 代码转化为C/C++代码
  2. OC对象的本质
  3. 创建一个实例对象,至少需要多少内存?
  4. 创建一个实例对象,实际分配了多少内存?

实践

  1. 将Objective-C 代码转化为C/C++代码
# xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc Objective-C源文件 -o 目标c或者cpp 文件

例如:xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main_arm64.cpp

可能会遇到如下问题:
xcrun: error: SDK "iphoneos" cannot be located
main.m:8:9: fatal error: 'Foundation/Foundation.h' file not found
#import <Foundation/Foundation.h>
        ^~~~~~~~~~~~~~~~~~~~~~~~~
main.m:8:9: note: did not find header 'Foundation.h' in framework 'Foundation' (loaded from '/System/Library/Frameworks')
1 error generated.

解决方案:
# 给Xcode命令行工具指定路径
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/

转化前的OC文件如下

@interface ClassA : NSObject

@property (nonatomic,strong)NSString *name;  // 8bit



@end

@implementation ClassA
{
    int _age;  // 4bit
//    int _num;  // 4bit;
//    long _num1; // 8bit
//    int *p;    // 8 bit
//    long array[20]; //160 bit
}


@end

转化后的cpp 文件如下:

struct ClassA_IMPL {
    struct NSObject_IMPL NSObject_IVARS;
    int _age;
    NSString *_name;
};

  1. OC对象的本质
    根据上面的案例我们就可以得到OC 对象的本质就是一个结构体

  2. 创建一个实例对象,至少需要多少内存?

#import <objc/runtime.h>
class_getInstanceSize([NSObject class])

# 案例:
@interface Person:NSObject
{
  int _age;  // 4bit
 int _height; // 4bit
int *p; //8bit
}

class_getInstanceSize([Person class]) 这个函数的结果是 24;



@end
  1. 创建一个实例对象,实际分配了多少内存?
#import <malloc/malloc.h>
NSObject *obj = [NSObject new];
malloc_size((__bridge const void *)obj);

# 案例:
@interface Person:NSObject
{
  int _age;  // 4bit
 int _height; // 4bit
int *p; //8bit
}

Person *person = [Person new];
malloc_size((__bridge const void *)person); 这个函数的结果是 32;

# 这里结果是 32 是因为apple 源码中定义了 内存块 必须是16的倍数 
例如:16,32,48,64....


上一篇 下一篇

猜你喜欢

热点阅读