美文网首页iOS-基础
-ObjC是干嘛的?

-ObjC是干嘛的?

作者: 然必果 | 来源:发表于2020-03-26 15:32 被阅读0次

    近来一位同事说,把项目中的 -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。

    结束~

    相关文章

      网友评论

        本文标题:-ObjC是干嘛的?

        本文链接:https://www.haomeiwen.com/subject/qkrcuhtx.html