是否可以记录objective-c选择器,即SEL类型的变量?

是否可以记录objective-c选择器,即SEL类型的变量?,objective-c,Objective C,在一些遗留代码中(是的,现在已被块取代),我有以下几行代码: [UIWindow setAnimationDelegate:self]; [UIWindow setAnimationDidStopSelector:@selector(animationFinished:finished:context:)]; 但是没有定义方法-animationFinished:finished:context:,但是代码没有崩溃。我想知道为什么,所以我尝试记录@selector返回的内容,但不知道如何记录

在一些遗留代码中(是的,现在已被块取代),我有以下几行代码:

[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");
}
所以这里似乎有一个非nil SEL类型,但没有相应的方法。有办法吗 到NSLog()一个SEL类型,或者有人能解释一下这里发生了什么吗? 据推测,setAnimationDidStopSelector:的实现能够处理SEL
没有相应的方法,只会忽略它。

您已经在使用
NSStringFromSelector
,这是记录选择器的正确方法。无论您是自己创建选择器,还是询问目标类它有什么选择器,都是另一回事


您还可以使用
respondsToSelector:
来确定指定的类是否能够实际处理您要对其调用的方法。

可能
UIWindow
检查选择器是否在
self
中使用

- (BOOL)respondsToSelector:(SEL)aSelector

如果它没有实现,就不会调用该方法

是的,选择器(即SEL对象)可能存在,即使实际方法尚未实现

在Objective-C中,对象可以响应任何选择器,无论它是否对应于方法。选择器的验证是一项运行时工作。(但是,使用ARC引入的一些限制)


如果要检查接收器是否实现了它(或者更正式地检查它是否响应选择器),请使用其
-(BOOL)respondsToSelector:(SEL)selector
方法

对选择器的响应如何?谢谢。所以我想我的另一半问题的答案是不,你不能记录SEL类型的var,但是你也不需要记录。我不确定SEL类型的对象是否真的有描述,如果它是一个对象的话。但您可以将其转换为字符串,就像您已经尝试过的那样,并记录它。