将oc的代码转换成c或者c++代码的命令(比如我转换的main.m文件)
首先切换到main.m所在的文件位置,然后执行这段命令:
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m
如果代码中有__weak
执行这段命令
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc -fobjc-arc -fobjc-runtime=ios-8.0.0 main.m
- category作用:一般来说我们给某个类或者对象增加分类,用他来扩展我们相关方法或者成员变量等。
- category 的使用:不做说明 太简单了。
- category的实现原理:
category的底层结构是struct category_t 里面包含了基本的 类方法、实例方法、协议信息、成员变量、当程序运行的时候,利用运行时机制将类方法、实力方法、协议信息等合并到原来的类中。
解释:在这个网站上下载苹果的源码:https://opensource.apple.com/tarballs/objc4/
(苹果部分源码开元网站,记住下载最大最新的那个)然后搜索category_t ,就可以看到他的结构 - category 和class extension 的区别是什么:
class extension 例如就是这个:
@interface DGStudent : NSObject
@property (assign, nonatomic) int weight;
- (void)test;
@end
其中class extension 是在编译的时候就已经将类信息等等加载到类中,而category是在运行时,利用运行时机制将这些信息加载到类中。
- category有load方法吗?load方法是什么时候调用的?load方法可以继承吗?
有load方法
在runtime开始加载类、分类的时候开始调用(也就是加载进内存的时候开始调用)
有继承,但是我们一般不主动调用load方法 - category 方法和原类中方法一样,调用哪个?
调用分类的,因为底层代码是这样写的。 - category 是覆盖吗?为什么?
不是覆盖,我们可以用运行时方法便利进行查找,发现有很多的重复方法,他不是真的覆盖,因为调用方法,相当于发送给一个对象方法一个方法,但是他只要找到了方法了就会执行,分类的方法、类方法 是加载到原类方法之前的。所以会先找到。 -
如果给person添加两个分类其中,test分类方法中有run方法,eat方法中也有run方法,那么运行程序 执行的是哪个方法,要看编译顺序,也就是build parse中的顺序,放在后面的分类先编译,也就是执行先执行后面的分类