近来一位同事说,把项目中的 -ObjC 删除,打包时可以省下 10多M,并且编译通过可以运行,那何乐不为?
项目中,真的可以随意删除这个标记吗?
为此,翻阅了以下资料:【iOS系列】聊聊 "-ObjC" 的故事
这篇文章讲到了大部分的知识点,很想自己动手试验一下,于是得到下面的结论:
扩展的 .m 实现函数,一定要与原类的实现.m 放在一起,不然需要引入 -ObjC ; 自己定于的类可以做到这点,但是系统或者其他库定义的类,我们没有办法写.m文件,再去做扩展,一定是把实现写在自己的.m文件里面,那么在引用时,就一定要加 -ObjC了,不然会在用到扩展函数时才报错,很难发觉;
下面是测试过程:
我是用腾讯的TIMSDK来做测试的。
TIMSDK 接入文档 里面明确标明,手动引入时,需要添加 -ObjC,如下图:
我在手动引入SDK后,没有引用-ObjC;而且调用了扩展方法[TIMConversation getSelfIdentifier],并没有崩溃,这是为什么?
后来想想,估计getSelfIdentifier是跟原类的定义是写在同一个.m文件中的。
当然,要验证一下这个猜想是否正确了
分成两个工程,一个是静态库工程,用来生成静态库;一个是测试工程,用来测试引入生成的静态库时,是否需要添加 -ObjC
静态库工程主要文件:
// TestClass.h 原类
@interface TestClass : NSObject
+ (void)testStatic;
- (void)testInstance;
@end
// TestClass.m
#import "TestClass.h"
@implementation TestClass
+ (void)testStatic {
NSLog(@"testStat1");
}
- (void)testInstance {
NSLog(@"testInst1");
}
@end
// TestClass+Cat.h 扩展
@interface TestClass (Cat)
+ (void)testStatic2;
- (void)testInstance2;
@end
@implementation TestClass (Cat)
+ (void)testStatic2 {
NSLog(@"testStat2");
}
- (void)testInstance2 {
NSLog(@"testInst2");
}
@end
关键点是上面的代码放在那里,假如放在 TestClass.m 里面,引用工程不用添加 -ObjC;假如是方法 TestClass+Cat.m 文件里面,就要添加 -ObjC。
结束~
网友评论