isa补充

280 阅读1分钟

1、补充clang

通过终端,利用clang将main.m编译成 main.cpp,有以下几种编译命令,这里使用的是第一种

//1、将 main.m 编译成 main.cpp

clang -rewrite-objc main.m -o main.cpp

//2、将 ViewController.m 编译成 ViewController.cpp

clang -rewrite-objc -fobjc-arc -fobjc-runtime=ios-13.0.0 -isysroot / /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.7.sdk ViewController.m

上面不行,就用下面的:注意一定要cd的相关的文件下面

clang -x objective-c -rewrite-objc -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk xxxxx.m

//以下两种方式是通过指定架构模式的命令行,使用xcode工具 xcrun

//3、模拟器文件编译 - xcrun -sdk iphonesimulator clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp 或者 xcrun -sdk iphonesimulator clang -rewrite-objc ViewController.m

//4、真机文件编译

- xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main- arm64.cpp

//原工程中的 // 成员变量 vs 属性

@interface LGPerson : NSObject
{
    NSString *hobby;
    NSObject *objc;
}
@property (nonatomic, copy) NSString *nickName;
@property (nonatomic, strong) NSString *name;
@end

打开编译好的 cpp 文件,会自动生成对应的 set get 方法如下:
 `_I_LGPerson_name`
`_I_LGPerson_setName_`

extern "C" unsigned long OBJC_IVAR_$_LGPerson$_nickName;
extern "C" unsigned long OBJC_IVAR_$_LGPerson$_name;
struct LGPerson_IMPL {
struct NSObject_IMPL NSObject_IVARS;
NSString *hobby;
NSObject *objc;
NSString *_nickName;
NSString *_name;
};