在红宝石中,我可以从一个物体中去了解细节。我如何在目标c中做类似的事情?谢谢。
答案 0 :(得分:5)
-[NSObject description]
提供了一个对象的基本描述(类似于Java中的toString
- 我真的不知道Ruby中的.inspect
。在description
中打印对象时会自动调用NSLog
。(例如NSLog(@"@%", myObject)
)。
对于其他内省方法,我建议查看NSObject参考。您可以使用the Objective-C runtime直接执行许多操作。
答案 1 :(得分:5)
如果您只是想要打印某些内容,可以使用之前说过的description
。
我自己不是Ruby人,但如果我理解这一点,Ruby中的.inspect
会打印出一个对象的所有实例变量。这不是Cocoa内置的东西。如果需要,可以使用运行时系统查询此信息。
这是我放在一起的快速类别:
#import <objc/objc-class.h>
@interface NSObject (InspectAsInRuby)
- (NSString *) inspect;
@end
@implementation NSObject (InspectAsInRuby)
- (NSString *) inspect;
{
NSMutableString *result = [NSMutableString stringWithFormat: @"<%@:%p", NSStringFromClass( [self class] ), self ];
unsigned ivarCount = 0;
Ivar *ivarList = class_copyIvarList( [self class], &ivarCount );
for (unsigned i = 0; i < ivarCount; i++) {
NSString *varName = [NSString stringWithUTF8String: ivar_getName( ivarList[i] )];
[result appendFormat: @" %@=%@", varName, [self valueForKey: varName]];
}
[result appendString: @">"];
free( ivarList );
return result;
}
@end
答案 2 :(得分:2)
只需使用NSLog打印出来
NSLog(@"%@", myObject);
它会自动调用对象的description
方法。如果这是您创建的类,您将需要定义它(使用信息返回NSString
)。
答案 3 :(得分:1)
NSObject的描述方法类似于inspect
答案 4 :(得分:1)
在你的NSObject的h文件中写下这个:
- (NSDictionary *)dictionaryRepresentation;
在你的NSObject的m文件中写下:
(NSDictionary *)dictionaryRepresentation { unsigned int count = 0; //获取班级中所有属性的列表。 objc_property_t * properties = class_copyPropertyList([self class],&amp; count);
NSMutableDictionary * dictionary = [[NSMutableDictionary alloc] initWithCapacity:count];
for(int i = 0; i&lt; count; i ++){ NSString * key = [NSString stringWithUTF8String:property_getName(properties [i])]; NSString * value = [self valueForKey:key];
// Only add to the NSDictionary if it's not nil. if (value) [dictionary setObject:value forKey:key];
}
自由(属性);
返回字典; }
(NSString *)description { return [NSString stringWithFormat:@“%@”,[self dictionaryRepresentation]]; }