在一些遗留代码中(是的,现在这已被块取代)我有以下几行:
[UIWindow setAnimationDelegate:self];
[UIWindow setAnimationDidStopSelector:@selector(animationFinished:finished:context:)];
但是那个方法 - animationFinished:finished:context: - 没有定义,但代码没有崩溃。我想知道为什么,所以我试着记录@selector返回的内容,但我不知道如何。
NSLog(@"%@", NSStringFromSelector(@selector(animationFinished:finished:context:)));
没有帮助 - 它会记录选择器的字符串名称,无论该方法是否实际实现。
你可以安全地将nil传递给很多方法,所以我假设@selector()在这里返回nil,但是 以下代码不记录任何内容:
if (@selector(animationFinished:finished:context:) == nil) {
NSLog(@"SEL is NIL");
}
所以看来我这里有一个非零的SEL类型,但没有相应的方法。有办法吗? 到NSLog()一个SEL类型或任何人都可以解释这里发生了什么? 据推测,setAnimationDidStopSelector:的实现能够应对SEL 没有相应的方法,只是忽略它..
答案 0 :(得分:4)
您已经在使用NSStringFromSelector
,这是记录选择器的正确方法。无论您是自己创建选择器还是向目标类询问它具有哪个选择器都是另一回事。
您还可以使用respondsToSelector:
来确定指定的类是否可以实际处理您要在其上调用的方法。
答案 1 :(得分:1)
是的,即使没有实现实际方法,选择器(即SEL对象)也可能存在。
在Objective-C中,对象可以响应任何选择器,无论它是否与方法相对应。选择器的验证是一种运行时的努力。 (然而,在ARC引入的一些限制)
如果要检查接收器是否已实现(或更正式地是否响应选择器),请使用其-(BOOL)respondsToSelector:(SEL)selector
方法。
答案 2 :(得分:0)
可能UIWindow
检查选择器是否实际在self
中使用
- (BOOL)respondsToSelector:(SEL)aSelector
如果没有实现,它不会调用该方法。