近來一位同事說,把項(xiàng)目中的 -ObjC 刪除躲雅,打包時(shí)可以省下 10多M鼎姊,并且編譯通過可以運(yùn)行,那何樂不為相赁?
項(xiàng)目中相寇,真的可以隨意刪除這個(gè)標(biāo)記嗎?
為此钮科,翻閱了以下資料:【iOS系列】聊聊 "-ObjC" 的故事
這篇文章講到了大部分的知識(shí)點(diǎn)唤衫,很想自己動(dòng)手試驗(yàn)一下,于是得到下面的結(jié)論:
擴(kuò)展的 .m 實(shí)現(xiàn)函數(shù)跺嗽,一定要與原類的實(shí)現(xiàn).m 放在一起战授,不然需要引入 -ObjC ; 自己定于的類可以做到這點(diǎn),但是系統(tǒng)或者其他庫定義的類桨嫁,我們沒有辦法寫.m文件植兰,再去做擴(kuò)展,一定是把實(shí)現(xiàn)寫在自己的.m文件里面璃吧,那么在引用時(shí)楣导,就一定要加 -ObjC了,不然會(huì)在用到擴(kuò)展函數(shù)時(shí)才報(bào)錯(cuò)畜挨,很難發(fā)覺筒繁;
下面是測(cè)試過程:
我是用騰訊的TIMSDK來做測(cè)試的。
TIMSDK 接入文檔 里面明確標(biāo)明巴元,手動(dòng)引入時(shí)毡咏,需要添加?-ObjC,如下圖:
我在手動(dòng)引入SDK后逮刨,沒有引用-ObjC呕缭;而且調(diào)用了擴(kuò)展方法[TIMConversation getSelfIdentifier],并沒有崩潰,這是為什么恢总?
后來想想迎罗,估計(jì)getSelfIdentifier是跟原類的定義是寫在同一個(gè).m文件中的。
當(dāng)然片仿,要驗(yàn)證一下這個(gè)猜想是否正確了
分成兩個(gè)工程纹安,一個(gè)是靜態(tài)庫工程,用來生成靜態(tài)庫砂豌;一個(gè)是測(cè)試工程厢岂,用來測(cè)試引入生成的靜態(tài)庫時(shí),是否需要添加 -ObjC
靜態(tài)庫工程主要文件:
//?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 擴(kuò)展
@interface TestClass (Cat)
+ (void)testStatic2;
- (void)testInstance2;
@end
@implementation TestClass (Cat)
+ (void)testStatic2 {
? ? NSLog(@"testStat2");
}
- (void)testInstance2 {
? ? NSLog(@"testInst2");
}
@end
關(guān)鍵點(diǎn)是上面的代碼放在那里阳距,假如放在?TestClass.m 里面咪笑,引用工程不用添加 -ObjC;假如是方法??TestClass+Cat.m 文件里面娄涩,就要添加?-ObjC。
結(jié)束~