摆脱“'NSObject'可能无法响应'-someMethod'”警告

时间:2009-07-08 03:00:11

标签: objective-c cocoa

我正在学习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
    }
}

4 个答案:

答案 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];
}
相关问题