你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> 好玩的debugDescription & runtime(debug模式下調試model)

好玩的debugDescription & runtime(debug模式下調試model)

編輯:IOS開發基礎

QQ截圖20160202104656.png

本文為投稿文章,作者:咖啡豬_iOSer


description

在開發過程中, 往往會有很多的model來裝載屬性. 而在開發期間經常會進行調試查看model裡的屬性值是否正確. 那麼問題來了, 在Objective-C裡使用NSLog("%@",model)這行代碼打印出來的卻是model的地址. 不是我們所想要的結果~! 看圖:

660127-b1d490258710299f.jpg

那麼問題又來了?有沒有辦法解決這個問題尼,答案那就是有~!只需要重寫- (NSString *)description方法即可。如下代碼:

.h文件

#import [Foundation/Foundation.h](編輯注:因識別問題,這裡將尖括號改為方括號)

@interface TestModel : NSObject
@property (copy,nonatomic) NSString *text;
@property (assign,nonatomic) NSInteger index;
@end

.m文件

#import "TestModel.h"

@implementation TestModel
- (NSString *)description {
    return [NSString stringWithFormat:@"text:%@--index:%zi",self.text,self.index];
}
@end

然後這時候在使用NSLog("%@",model)這行代碼就能打印我們想要的結果了。 看如下圖:

660127-7e2638cdbda003b3.jpg

那麼問題繼續來了...

如果model裡有N多個屬性尼, 可能10個, 可能20個... 難道要在description方法裡一個一個寫屬性並拼接返回? 你不嫌麻煩, 我光看著都蛋疼了... 所以我們可以采用runtime技術來動態獲取屬性並返回. 如下修改後的.m文件代碼:

修改後的.m文件

#import "TestModel.h"
#import //導入runtime頭文件

@implementation TestModel
- (NSString *)description {
    //初始化一個字典
    NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
    
    //得到當前class的所有屬性
    uint count;
    objc_property_t *properties = class_copyPropertyList([self class], &count);
    
    //循環並用KVC得到每個屬性的值
    for (int i = 0; i

然後在打印model, 如下圖:

660127-0b4a86c292c2e80e.jpg

debugDescription

現在問題繼續來了..

在項目中NSLog語句往往也很多. 如果重寫description方法. 在控制台則會打印出很多屬性. 看著就不舒服~~而且還有一個問題就是, 有時候我們其實並不需要打印model的屬性.. 那這樣重寫description方法反而適得其反了! 所有, 現在有一個解決方案就是重寫debugDescription方法

什麼是debugDescription? 其實debugDescription和description是一樣的效果. 只不過唯一的區別就是debugDescription是在Xcode控制台裡使用po命令的時候調用的~!

而debugDescription的實現其實也就是調用了description方法而已。

so, 在開發過程中並且model調試的時候, 筆者推薦重寫debugDescription方法而不是重寫description方法. 當需要打印model的屬性的時候, 在控制台裡使用po命令即可. 如下在此修改後的.m文件

#import "TestModel.h"
#import //導入runtime頭文件

@implementation TestModel

// 重寫debugDescription, 而不是description
- (NSString *)debugDescription {
    //聲明一個字典
    NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
    
    //得到當前class的所有屬性
    uint count;
    objc_property_t *properties = class_copyPropertyList([self class], &count);
    
    //循環並用KVC得到每個屬性的值
    for (int i = 0; i

看如下圖, 分別使用了NSLog和po命令的打印

660127-f04ff7fb6973ffc2.jpg

結果:

660127-1212445cc7ca3f1a.jpg

這就達到了我們想要的效果, 如果需要打印model的屬性, 打個斷點然後使用po命令即可

Demo地址

最後,附上本文章的一個小demo示例代碼,已放在github上。

https://github.com/DemoMania/DebugDescriptionDemo

總結

  • model調試的時候, 推薦重寫debugDescription而不是description

  • 利用runtime技術動態獲取class的屬性

  • 在base基類裡重寫debugDescription方法,隨後所有model繼承與baseModel即可。

  • 在重寫的debugDescription的方法裡最好不要調用自身debugDescription([self debugDescription])

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved