iOS 8:CCLogSystem的簡單封裝
原文 http://www.cnblogs.com/michaellfx/p/4218864.html
摘要
本文記錄筆者封裝CCLogSystem遇到的問題及解決方案,同時簡要說明封裝第三方庫的必要性。
關鍵字:CCLogSystem 封裝
對于第三方庫,若庫的作者不再更新,或新版與舊版接口差異太大且新版有更多實用功能或性能有較大提升,或舊版為32位代碼而我們的應用為64位導 致編譯過程總有大大小小的問題出現,或者存在MRC遺留代碼等等問題。若在整個工程中直接到處使用,則更新時可能出現到處報錯。因此,一般的做法是,在第 三方庫上做一層簡單的封裝,在工程中使用此封裝。當庫發生變化時,只需處理我們的封裝層,體現了封裝變化的面向對象思想。
CCLogSystem的作者提供了兩個宏方便我們使用,但是,在Xcode中,宏沒有接口提示信息,我又不想寫文檔或培訓團隊其他成員使用這個日志系統,所以,最好的辦法是,將宏改成函數,給函數加上說明,Xcode一提示就能看到,連頭文件都不用打開。
因開發進度較緊,暫做層簡單封裝。
MKLogSystem.h //////////////////////////////////////////////////import "CCLogSystem.h"
CC_EXTERN void MKLog (NSString format, ...); CC_EXTERN void MKLogValue (NSString format, ...); @interface MKLogSystem : NSObject
- (void)activeLogViewController; @end MKLogSystem.h ////////////////////////////////////////////////// #import "MKLogSystem.h" @implementation MKLogSystem
- (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[CCLogSystem setupDefaultLogConfigure];
});
}
/**
- @abstract 彈出Developer UI,查看或者Email Log */
- (void)activeLogViewController {
[CCLogSystem activeDeveloperUI];
}
@end
/**
- @abstract 按指定格式打印日志。<p>用法與NSLog相同,如 MKLog(@"%@@", yourObject);。 <p>若只輸出值,使用MKLogValue(yourObject);更快捷。
- @discussion 打印格式為【時間戳 + 線程信息 + 文件名 + 代 碼行數 + 方法名 + 原始打印信息】 *
- @param ... 原始打印信息,如各種對象 *
- @return 無 / void MKLog(NSString format, ...) { NSString *string; { va_list argList; va_start(argList, format); string = [[NSString alloc] initWithFormat:format arguments:argList]; va_end(argList); } CCLog(CC_LOCATION(), string); } /**
- @abstract 使用默認格式打印日志,輸入需打印的數據即可,如MKLogValue(self.view)
- @discussion 打印格式為【時間戳 + 線程信息 + 文件名 + 代 碼行數 + 方法名 + 原始打印信息】 *
- @param ... 原始打印信息,如各種對象 *
- @return 無
/
void MKLogValue(NSString data, ...)
{
static NSString format = @"%@";
NSString string;
{
va_list argList;
va_start(argList, data);
string = [[NSString alloc] initWithFormat:format arguments:argList];
va_end(argList);
}
MKLog(string);
}</pre>
調用時,Xcode提示如圖所示。
遇到的問題及解決方案
因
]
得到的上一調用者的名字并不一定可靠,因為Objective-C運行時可能會插入部分運行時函數。
那么,現在只好先用
MKLog (CC_LOCATION(), __VA_ARGS__)
和
MK_LOG(@"%@", CC_STRING_FOR_LOG_VALUE(__VA_ARGS__))
,缺點是Xcode無提示文檔,就一個簡單的定義位置鏈接。
總結
盡管經過多次嘗試,這依然是一次不成功的封裝。也查閱了Objective-C運行時相關資料,花了不少時間,略遺憾。