01.Objective-C 对象 本质
2021-01-04 本文已影响0人
ProfessorFan
问题
- 将Objective-C 代码转化为C/C++代码
- OC对象的本质
- 创建一个实例对象,至少需要多少内存?
- 创建一个实例对象,实际分配了多少内存?
实践
- 将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;
};
-
OC对象的本质
根据上面的案例我们就可以得到OC 对象的本质就是一个结构体 -
创建一个实例对象,至少需要多少内存?
#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
- 创建一个实例对象,实际分配了多少内存?
#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....