我正在学习ObjectiveC并遇到了与内省相关的问题。基本上,我循环遍历一组对象并确定它们是否接受lowercaseString
选择器。如果他们这样做,我会在对象上调用该选择器。在我确保对象响应该选择器后,我调用它。但是,当我这样做时,我收到了这个警告:“警告:'NSObject;可能无法响应'-lowercaseString'”
虽然编写的代码工作正常,但我不想收到警告。我假设有一种“正确”的方式来确保我没有得到警告(即没有关闭警告)。有什么想法吗?
NSMutableArray *myArray = [[NSMutableArray alloc] init];
[myArray addObject:@"Hello!"];
[myArray addObject:[NSURL URLWithString:@"http://apple.com"]];
[myArray addObject:[NSProcessInfo processInfo]];
[myArray addObject:[NSDictionary dictionary]];
SEL lowercaseSelector = @selector(lowercaseString);
for (NSObject *element in myArray) {
if ([element respondsToSelector:lowercaseSelector]) {
NSLog([element lowercaseString]); // Warning here
}
}
答案 0 :(得分:15)
您也可以使用id
这是任何类型的对象。
for (id element in myArray) {
if ([element respondsToSelector:lowercaseSelector]) {
NSLog([element lowercaseString]);
}
}
答案 1 :(得分:6)
如何使用performSelector:
?
SEL lowercaseSelector = @selector(lowercaseString);
for (NSObject *element in myArray) {
if ([element respondsToSelector:lowercaseSelector]) {
NSLog([element performSelector:lowercaseSelector]); // No warning
}
}
这将消除您的编译器警告。
答案 2 :(得分:4)
在调用函数之前,只需将NSObject强制转换为NSString:
for (NSObject *element in myArray) {
if ([element respondsToSelector:lowercaseSelector]) {
NSLog([(NSString*)element lowercaseString]); // No warning!
}
}
答案 3 :(得分:1)
转换为ID删除了警告。
if ([self.content respondsToSelector:@selector(setDelegate:)])
{
[(id)self.content setDelegate:nil];
}