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

Tys*_*son 10 cocoa objective-c

我正在学习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
    }
}
Run Code Online (Sandbox Code Playgroud)

Rol*_*ien 16

您还可以使用id哪种类型的对象.

for (id element in myArray) {
    if ([element respondsToSelector:lowercaseSelector]) {
        NSLog([element lowercaseString]);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 解决方法是使所有协议都符合<NSObject(这是一个协议以及一个类).无论如何,这不适用于普通id. (2认同)

小智 6

怎么用performSelector:

SEL lowercaseSelector = @selector(lowercaseString);

for (NSObject *element in myArray) {
    if ([element respondsToSelector:lowercaseSelector]) {
        NSLog([element performSelector:lowercaseSelector]); // No warning
    }
}
Run Code Online (Sandbox Code Playgroud)

这将摆脱你的编译器警告.