有没有办法找出Cocoa中的任意对象是否是基础对象?我在谈论的NSString,NSArray的,NSDictionary的等如何检查对象是否是Cocoa中的Foundation对象?
让我解释多一点...
Foundation对象(据我所知)有一些共同的特点:它们都实现了NSCoding协议,它们都可以进入PList等
因此,例如,如果我想存档一个对象图到磁盘,这将是有用的,以确保我添加到对象图的任何对象是基础对象或我的自定义对象我已经实施了NSCoding,并且这看起来很愚蠢:
if ([myObject isKindOfClass:[NSString class]] ||
[myObject isKindOfClass:[NSNumber class]] ||
[myObject isKindOfClass:[NSArray class]] ||
[myObject isKindOfClass:[NSDictionary class]] ||
[myObject isKindOfClass:[NSSet class]] ||
...) {
//add myObject to object graph
}
这是一个简单但可能没用的例子,我遇到的问题是我编写的一些代码将字典转换为使用格式字符串与%@
说明符的url params字符串,但我不希望任意对象在那里去,因为我不想在我的网址参数的内存地址:
//convert dictionary into url params string
[postDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
if ([key isKindOfClass:[NSString class]] && ([obj isKindOfClass:[NSString class]] || [obj isKindOfClass:[NSNumber class]])) {
[tempPost appendFormat:@"%@=%@&", key, obj];
}
else {
*stop = TRUE;
}
}];
NSString *post;
if ([tempPost length] > 0) {
post = [tempPost substringToIndex:[tempPost length] - 1];
}
你是什么意思? _Every_'NSString'既是Foundation也是Core Foundation('CFStringRef')对象。他们是一样的。例如,这就是为什么你在调试器中看到'NSCFString'作为字符串的基本类型的原因。 –
请参阅我的编辑 – lms