iOS 8:CCLogSystem的简单封装

jopen 9年前

原文  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);  }

调用时,Xcode提示如图所示。

iOS 8:CCLogSystem的简单封装

遇到的问题及解决方案

]

得到的上一调用者的名字并不一定可靠,因为Objective-C运行时可能会插入部分运行时函数。

那么,现在只好先用

MKLog (CC_LOCATION(), __VA_ARGS__)

MK_LOG(@"%@", CC_STRING_FOR_LOG_VALUE(__VA_ARGS__))

,缺点是Xcode无提示文档,就一个简单的定义位置链接。

总结

尽管经过多次尝试,这依然是一次不成功的封装。也查阅了Objective-C运行时相关资料,花了不少时间,略遗憾。

</div> </div>