objective-c - Objective-C 中的选择器?

首先,我不确定我是否真的理解选择器是什么。据我了解,它是一个方法的名称,您可以将它分配给一个类型为“SEL”的类,然后运行诸如respondToSelector之类的方法,以查看接收者是否实现了该方法。有人可以提供更好的解释吗?

其次,到目前为止,我有以下代码:

NSString *thing = @"Hello, this is Craig";

SEL sel = @selector(lowercaseString:);
NSString *lower = (([thing respondsToSelector:sel]) ? @"YES" : @"NO");
NSLog (@"Responds to lowercaseString: %@", lower);
if ([thing respondsToSelector:sel]) //(lower == @"YES")
    NSLog(@"lowercaseString is: %@", [thing lowercaseString]);

然而,尽管 thing 显然是一种 NSString,并且应该响应小写字符串,但我无法让 'respondsToSelector' 条件返回“YES”...

最佳答案

您必须非常小心方法名称。在这种情况下,方法名称只是“lowercaseString”,而不是“lowercaseString:”(注意没有冒号)。这就是返回 NO 的原因,因为 NSString 对象响应 lowercaseString 消息而不是 lowercaseString:消息。

您如何知道何时添加冒号?如果您在调用它时添加一个冒号,则在消息名称中添加一个冒号,如果它接受一个参数就会发生这种情况。如果它接受零个参数(如 lowercaseString 的情况),则没有冒号。如果它需要多个参数,则必须添加额外的参数名称及其冒号,如 compare:options:range:locale:

您也可以查看documentation并注意是否存在尾随冒号。

https://stackoverflow.com/questions/738622/

相关文章:

iphone - 获取当前方法调用的线程id

ios - 如何将 NSAppTransportSecurity 添加到我的 info.plist

ios - NSLocalizedString() 的第二个参数是什么?

objective-c - Swift 中的只读和非计算变量属性

objective-c - 在 Objective-C 中将 NSNumber 转换为 int

ios - 如何使用 NSCache

objective-c - Xcode 不显示导致崩溃的行

iphone - 使用 CALayers 的圆形 UIView - 只有一些角落 - 如何?

objective-c - "Receiver type ' CALayer' 例如消息是前向声明”

objective-c - 在 Objective-C 中将 NSArray 过滤成一个新的 NSA