iOS-基础

-ObjC是干嘛的?

2020-03-26  本文已影响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。

结束~

上一篇下一篇

猜你喜欢

热点阅读