如果引入不支持 x86
的靜態(tài)庫, 則模擬器就不能正常調(diào)試了.
報以下類似的錯誤:
之前使用別的公司的
SDK
時候如果不支持 x86
的話, 最簡單的解決辦法就是直接找技術(shù)支持要一個支持的新靜態(tài)庫,正常都會給你的,但是這次人家不愿意給(原因:相關(guān)功能需要使用真機(jī)硬件設(shè)備,模擬器不具備硬件條件
),所以拒絕了.
但是有些情況下又需要用模擬器來調(diào)試, 比如 UI 需要更換不同尺寸的模擬器來調(diào)試, 既然人家不愿意給,只能自己解決了.
正常就算導(dǎo)入了靜態(tài)庫, 只要代碼里面沒有引入靜態(tài)庫的類, 編譯就能正常通過,否則就會報錯.
但是導(dǎo)入靜態(tài)庫不就是為了用么?
既然必須使用, 還要在模擬器調(diào)試時候不引入, 只能利用條件編譯來解決了
這里可以直接使用系統(tǒng)的宏來解決:
TARGET_OS_IPHONE
如果是真機(jī), 則為真
// 如果是真機(jī)運(yùn)行,則編譯以下內(nèi)容, 否則忽略
#if TARGET_OS_IPHONE
#endif
或者使用
TARGET_IPHONE_SIMULATOR
使用模擬器運(yùn)行為真
// 如果是非模擬器的設(shè)備, 則編譯以下內(nèi)容, 否則忽略
#if !TARGET_IPHONE_SIMULATOR
#endif
可以分成多段使用:
引入頭文件
#if TARGET_OS_IPHONE
#import "xxxxx.h"
#import "xxxxx.h"
...
...
#endif
類/方法調(diào)用
- (void)example {
#if TARGET_OS_IPHONE
XClass *xx = [[XClass alloc] init];
[xx method];
....
....
#endif
}
埋坑系列
有些第三方的 SDK
有靜態(tài)庫的同是, 還附帶一些工具類, 或者帶有一些 UI
類, Controller + StoryBoard
, 集成最簡單的辦法就是使用第三方提供的 UI
類來集成.(這些 UI
類你是可以看到源碼的)
如果 UI
類報錯了, 當(dāng)然可以使用簡單粗暴的方法:
#if TARGET_OS_IPHONE
#import "xxxxxxx.h"
#import "xxxxxxx.h"
....
....
@interface ViewController ()
- (IBAction)xxxx:(UIButton *)sender;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
....
}
- (void)sample {
....
}
@end
#endif
但是問題沒有那么簡單
第一種比較簡單的情況:
你會發(fā)現(xiàn)在真機(jī)上運(yùn)行之后突然Crash
掉.
錯誤信息如下:
雖然編譯階段通過了, 但是系統(tǒng)卻找不到這個類的實現(xiàn)部分, 最終導(dǎo)致
StoryBoard
默認(rèn)加載UIViewController
, 然后又調(diào)用了UIViewController
本身沒有實現(xiàn)的方法,導(dǎo)致最終Crash
.
第二種情況:
如果這個 UI
類存在 Category
的話, 連編譯階段都通過不了,會報如下錯誤:
解決辦法
針對以上2種情況, 有共同的解決辦法:
#import "xxxxxxx.h"
// 根據(jù)需求引入靜態(tài)庫相關(guān)的頭文件
#if TARGET_OS_IPHONE
#import "xxxxxxx.h"
#import "xxxxxxx.h"
....
....
#endif
@interface ViewController ()
- (IBAction)xxxx:(UIButton *)sender;
@end
@implementation ViewController
// 只把類的方法寫在條件編譯條件內(nèi)
#if TARGET_OS_IPHONE
- (void)viewDidLoad {
[super viewDidLoad];
....
}
- (void)sample {
....
}
#endif
@end
最后出現(xiàn)的2個問題, 只給出了錯誤樣例和解決辦法,沒有解釋問題的原因只做如下猜測:
問題1可能是因為編譯器的原因, 沒有找到類頭文件對應(yīng)
.m
文件內(nèi)類實現(xiàn)部分, 所以未把類的實現(xiàn)部分編譯進(jìn)去.但是編譯階段還是通過了.最終導(dǎo)致 Crash
問題2中可能在編譯階段就要把
Category
融入到類中去, 但是未找到類的實現(xiàn)部分, 所以編譯無法進(jìn)行下去,所以報錯.