
2017新年快樂(lè)
在調(diào)試程序的時(shí)候,我們經(jīng)常需要打印并查看對(duì)象信息。一種辦法是將對(duì)象的全部屬性打印出來(lái),另一種是挑選我們需要的信息。
NSLog(@"obj = %@",obj);
這種打印全部屬性只適用于 iOS 原有的對(duì)象類(lèi)型,而自定義的類(lèi)型將只是輸出下面這樣的信息:
< Person: 0x6080000258e0>
自定義的類(lèi)輸出的信息并不太有用,所以我們需要自己去實(shí)現(xiàn)這個(gè) description 辦法。
//
// YYObject.h
// YYLog
#import <Foundation/Foundation.h>
@interface YYObject : NSObject
@property (nonatomic,copy) NSString *firstName;
@property (nonatomic,copy) NSString *lastName;
@end
//
// YYObject.m
// YYLog
#import "YYObject.h"
#import <objc/runtime.h>
@implementation YYObject
- (instancetype)init
{
if (self = [super init]) {
}
return self;
}
-(NSString *)description
{
return [NSString stringWithFormat:@"< %@: %p,firstName: %@,lastName:%@>",[self class],self,_firstName,_lastName];
}
@end
//打印出來(lái)的信息如下:
person:< Person: 0x60000002af80,firstName: wu,lastName:yy>
通過(guò)自己去實(shí)現(xiàn) description 辦法,是可以將我們需要的屬性信息打印出來(lái)。有一個(gè)問(wèn)題就是如果自定義的類(lèi)屬性很多,逐步去實(shí)現(xiàn)屬性是很浪費(fèi)時(shí)間的,所以利用 Runtime 進(jìn)行 description 的改造。
-(NSString *)description
{
NSLog(@"father's description!");
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
unsigned int count = 0;
Ivar *ivars = class_copyIvarList([self class], &count);
for (NSUInteger i = 0; i < count; i ++) {
Ivar ivar = ivars[i];
const char *name = ivar_getName(ivar);
NSString *key = [NSString stringWithUTF8String:name];
id value = [self valueForKey:key];
[dict setObject:value forKey:key];
}
free(ivars);
return [NSString stringWithFormat:@"< %@: %p, %@>",[self class],self,dict];
// return [NSString stringWithFormat:@"< %@: %p,firstName: %@,lastName:%@>",[self class],self,_firstName,_lastName];
}