我认为在属性类型很复杂的情况下,打印出objective-c中任何类的所有属性的值是非常困难的。
但是如果包含具有简单类型属性的类(如NSString,int,double,boolean),是否有任何方法可以自动NSLog而不是NSLog手动获取每个属性的值?
更新 :
您给我的所有解决方案仍然是手动的。有没有办法像遍历类的所有属性,NSLog variable_name 和 variable_value 。这就是我的预期。
答案 0 :(得分:6)
您可以通过覆盖-(void)description
方法来完成此操作。
实施例:
假设我们有简单的Car
类。
@interface Car : NSObject
@property (copy, nonatomic) NSString *model;
@property (copy, nonatomic) NSString *make;
@property (strong, nonatomic) NSDate *registrationDate;
@property (assign, nonatomic) NSInteger mileage;
@property (assign, nonatomic) double fuelConsumption;
@end
@implementation
- (NSString*)description {
return [NSString stringWithFormat:@"<%@:%p %@>",
[self className],
self,
@{ @"model" : self.model,
@"make" : self.make,
@"registrationDate": self.registrationDate,
@"mileage" : @(self.mileage),
@"fuelConsumption" : @(self.fuelConsumption)
}];
}
@end
将它放在NSDictionary
中将在控制台中创建非常好的输出。
另一方面,您可以在NSObject
课程上创建类别并执行以下操作:
- (NSString*)myDescriptionMethod {
NSMutableDictionary *dict = [NSMutableDictionary new];
unsigned int count;
objc_property_t *properties = class_copyPropertyList([self class], &count);
for (int i = 0; i < count; i++) {
const char *property = property_getName(properties[i]);
NSString *propertyString = [NSString stringWithCString:property encoding:[NSString defaultCStringEncoding]];
id obj = [self valueForKey:propertyString];
[dict setValue:obj forKey:propertyString];
}
free(properties);
return [NSString stringWithFormat:@"<%@ %p %@>",
[self class],
self,
dict];
}
然后,您将避免在您的课程中覆盖-(void)description
方法。
从here
获取答案 1 :(得分:2)
使用 NSObject
子类在 Objective-C 中实现您正在寻找的内容的最优雅方式,它可以覆盖 NSObject
方法description
。
例如(假设您的Class有一个名为propertyX的属性):
-(NSString *)description
{
return [NSString stringWithFormat:@"<myCustomObject: %@, propertyX: %f, %f>",
[self objectID], [self propertyX].x, [self propertyX].y];
}
description
的默认NSObject
实现只会返回指向该对象的内存地址,如下所示:
NSLog(@"%@", self);
2015-06-15 14:20:30.123 AppName [...] myCustomObject:0x000000&gt;
但是,通过覆盖如上所示的此基类方法,您将能够自定义此行为,并且日志将如下所示:
2015-06-15 14:20:30.123 AppName [...] myCustomObject:0x000000 someProperty,Property:blah,blah&gt;
有一个很好的教程,会进一步讨论here。
答案 2 :(得分:-4)
示例: -
+ (NSString *)description;
[NSString description];
提供有关NSString类的信息。