Objective-C的日志宏

来源:互联网 发布:洛阳理工网络教学平台 编辑:程序博客网 时间:2024/05/22 16:39


  使用NSLog记录日志是很方便的操作,但是有时候也希望能够像C/C++编程一样使用一些预定义的宏,比如获取当前文件名、行号等,在XCode中其实也有这样的功能。
  XCode的c预处理器提供了一些标准宏,另外Objective-C语言还提供了隐含的_cmd参数,可以用来获取当前方法的selector,以及将selector与class转换为字符串的函数。可以在NSLog中使用这些宏及函数来增强日志功能。
  能够在c/c++/Objective-C中使用的预处理宏有:
__func__ 格式%s 会替换为当前函数名
__LINE__ 格式%d 会替换为当前行号
__FILE__ 格式%s 会替换为当前文件名,包含完整的路径信息
__PRETTY_FUNCTION__ 格式%s 与__func__类似,但是函数名中包含了c++类型信息
   能够在Objective-C中使用的表达式/函数有:
NSStringFromSelector(_cmd) 格式%@ 返回当前selector名
NSStringFromClass([self class]) 格式%@ 返回当前对象的类名
[[NSString stringWithUTF8String:__FILE__] lastPathComponent] 格式%@ 返回当前文件名,不含路径信息
[NSThread callStackSymbols] 格式%@ 返回当前调用栈信息,注意不要把这些内容显示给最终用户,仅仅作为开发时调试使用
    详细内容参见:https://developer.apple.com/library/ios/#qa/qa1669/_index.html#//apple_ref/doc/uid/DTS40009343
Crash Report
    If an app is deployed in the App Store, then you will be able to see crash logs for it in iTunes Connect. But only if the effected customers have opted into sending diagnostic and usage information to Apple.
    上面这段话显示出,只有在用户设置了向apple发送诊断和使用信息的情况下才会搜集用户的crash reports。在大多数情况下,用户都会关闭这个选项,这样在iTunes Connect里就看不到任何错误报告。所以,自己实现一套错误报告搜集功能是个更好的选择。
    另外,关于如何让用户同意发送诊断及使用信息的方法可以参考这里:http://support.apple.com/kb/PH1124?viewlocale=zh_CN
ARC
    虽然使用ARC的好处多多,但在选择之前也需要考虑清楚,目前ARC只支持iOS5.0以上系统,在4.0上还不能支持weak reference,而对于解决strong reference cycle问题来说,弱引用是必须的。另外一些第三方库还并不能完美支持ARC,当然这也可以通过为特定文件指定-fno-obj-arc的方法来解决。
    ARC的使用很简单,去掉所有的retain/release/dealloc/autorelease方法,把原来property声明里的retain改为strong,assign改为weak,再把NSAutoReleasePool替换为@autoreleasepool即可满足绝大多数情况。
    另外还有一些需要注意的,包括属性名不能以new打头,不能显式调用dealloc但是可以实现自定义的dealloc方法,但是不要在方法中销毁内部变量,只需要翻译资源,同时也不需要调用[super dealloc],ARC为帮助完成这些操作。
    还有一些__strong、__weak、__unsafe_unretained、__autorelease标识符在绝大多数情况下都不会使用到,默认的__strong标识符即可以,而且也不需要显式的指明。
    需要注意的是,临时变量使用__weak标签的时候一定要小心,如果方法返回的是autorelease类型,将其赋值给__weak变量的时候,因为此时已经没有了强引用,该变量已不再存在,所以__weak变量获取到的值会是nil。
    类似的,如果方法返回的是__autorelease类型的对象指针,将其赋值给__strong变量,虽然运行结果是正确的,但是其内部行为并不如所期望的那样,会生成一个临时变量,具体说明可以参见apple官方文档。
    关于在C结构体中使用对象指针的问题,官方建议使用class代替,当然也可以将该文件指定为不使用ARC。
    最后,Toll Free Bridging只有在使用Core Foundtion库的时候才会遇到,一般情况下不用太在意。
    更加详细的描述可以参见这篇文章:http://longweekendmobile.com/2011/09/07/objc-automatic-reference-counting-in-xcode-explained/

原创粉丝点击