在输出字符串、一些基本数据类型以及 OC 对象,我们都可以使用 NSLog 函数进行输出。本次主要谈谈使用NSLog输出 OC 对象的应用。
一般情况下,我们在使用NSLog 和 %@ 输出某个对象时,就会调用这个对象的 description 方法,它的返回值就是 NSString 字符串类型,所以 description 默认实现返回的格式是 <类名: 对象的内存地址>,
在必要情况下,我们需要重写description方法以达到改变输出结果目的,覆盖description方法的默认实现。重写完description方法后,再调用NSLog(@”%@”,p)时输出结果不再是<类名: 内存地址>,而是返回的字符串。注意:千万不要在 description 方法中同时使用 %@ 和 self,如果这样使用了,那么最终会造成程序死循环,原因是因为:如果使用了%@和self,代表要调用self的description方法,最终就是循环调用description方法
一,对于NSArray和NSDictionary用descriptionWithLocale:方法
#import <Foundation/Foundation.h>
@interface NSArray (Log)
@end
@interface NSDictionary (Log)
@end
#import "NSArray+Log.h"
@implementation NSArray (Log)
- (NSString *)descriptionWithLocale:(id)locale
{
NSMutableString *strM = [NSMutableString stringWithString:@"(\n"];
[self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx,BOOL *stop) {
[strM appendFormat:@"\t%@,\n", obj];
}];
[strM appendString:@")"];
return strM;
}
@end
@implementation NSDictionary (Log)
- (NSString *)descriptionWithLocale:(id)locale
{
NSMutableString *strM = [NSMutableString stringWithString:@"{\n"];
[self enumerateKeysAndObjectsUsingBlock:^(id key,id obj,BOOL *stop) {
[strM appendFormat:@"\t%@ = %@;\n", key, obj];
}];
[strM appendString:@"}\n"];
return strM;
}
@end
二,对于一般的对象用description方法
#import <Foundation/Foundation.h>
@interface HMPerson : NSObject
@property (nonatomic,copy)NSString *name;
@property (nonatomic,assign)int age;
@end
#import "HMPerson.h"
@implementation HMPerson
- (NSString *)description {
return [NSStringstringWithFormat:@"%@{name:%@,age:%d}",[superdescription],self.name,self.age];
}
@end