免費開源的iOS開發學習平臺

                                                NSLog()函數:2-定制輸出日志的格式

                                                當我們調用NSLog()來打印調試信息時,默認情況下,系統會按照固定的格式來展示相關的信息。但是在實際的開發過程中,我們往往希望得到更多、更加詳細的信息,因此會涉及到對NSLog()函數進行輸出日志的定制。

                                                默認日志顯示格式

                                                在NSLog()中使用%@占位符來打印對象的功能是非常強大的,它不僅可以打印字符串、字典、數組等Foundation框架中已經定義的對象類型,我們自定義的對象類型也可以使用%@來打印。NSLog配合%@使用時,編譯器會自動調用被打印對象的description屬性的getter方法,如果打印的是類對象則調用類方法。

                                                在NSObject類中, 有一個名為description的屬性以及一個名為description的類方法,如下所示。

                                                @property (readonly, copy) NSString *description;
                                                + (NSString *)description; //默認會打印該對象的類名和它在內存中的地址
                                                

                                                我們新增一個Person類,并添加幾個屬性,然后實例化一個Person類對象,并打印對象信息,默認情況下,顯示信息如下。

                                                #import <Foundation/Foundation.h>
                                                @interface Person : NSObject
                                                @property (nonatomic, copy) NSString *name;
                                                @property (nonatomic, copy) NSString *sex;
                                                @property (nonatomic, assign) int age;
                                                @end
                                                
                                                #import <Foundation/Foundation.h>
                                                #import "Person.h"
                                                
                                                int main(int argc, const char * argv[]) {
                                                    @autoreleasepool { 
                                                        Person *p = [[Person alloc] init];
                                                        p.name = @"jack";
                                                        p.sex = @"man";
                                                        p.age = 18;
                                                        //打印對象信息
                                                        NSLog(@"%@", p);
                                                        NSLog(@"%@", [p class]);
                                                    }
                                                    return 0;
                                                }
                                                

                                                運行結果如下。我們可以看到,打印對象信息時,顯示的是對象的類型+內存地址。打印類類型時,顯示的是Person。

                                                重寫description方法

                                                當我們希望顯示更加個性化的打印信息時,我們可以重寫自定義類的description方法。如下所示, 我們在Person.m中添加如下代碼。

                                                #import "Person.h"
                                                @implementation Person
                                                //重寫description屬性的get方法
                                                - (NSString *)description {
                                                    return [NSString stringWithFormat:@"<Person: name: %@, sex: %@, age: %d>",
                                                            self.name, self.sex, self.age];
                                                }
                                                
                                                //重寫description類方法
                                                + (NSString *)description {
                                                    return @"這是Person類";
                                                }
                                                @end
                                                

                                                當我們再次運行之前的代碼時,打印信息如下。

                                                定制NSLog()打印的公共信息

                                                默認情況下,使用NSLog打印出來的日志前面帶有很長一串的時間戳,可能有時候我們根本用不到,而且還會影響查看的效率。其實對于NSLog的輸出格式我們也是可以自定義的,只需要我們寫一個宏定義就可以了。我們可以把如下宏定義放在程序運行環境中,即可改變NSLog()打印的公共信息,此時,打印的是調用NSLog()函數所在的文件以及行號。

                                                #define NSLog(FORMAT, ...) fprintf(stderr,"%s:%d\t %s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
                                                

                                                把上述代碼添加到main.m中,再次運行,顯示信息如下。

                                                由于NSLog的運行效率比較低,所以在項目中非調試狀態下(release)不應該出現大量的NSLog,所以有些時候我們會在項目的.pch文件(或者單獨建立一個Macro.h文件管理所有的宏)中去定義一個宏,讓調試函數只在調試版本(Debug)中生效,發布版本(Release)中就不能使用。

                                                下方的代碼段可以放在項目的宏定義文件中,也可以放在.pch文件中,添加后,打印日志只有在Debug模式下生效,Release模式不打印日志。

                                                #ifdef DEBUG
                                                #define NSLog(FORMAT, ...) fprintf(stderr,"%s:%d\t %s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
                                                #else
                                                #define NSLog(...)
                                                #endif
                                                

                                                示例代碼

                                                https://github.com/99ios/6.4.2


                                                欧美超级精品一级A片|欧美一级黄色视频|国产精品自在在线午夜免费|4444亚洲人成无码网在线观看|亚洲ⅴa曰本va欧美va视频