【问题标题】:Is it possible to NSLog an objective-c selector, namely a variable of the SEL type?是否可以 NSLog 一个objective-c 选择器,即SEL 类型的变量?
【发布时间】:2013-07-03 11:16:45
【问题描述】:

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

[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 没有对应的方法,只是忽略它..

【问题讨论】:

  • respondsToSelector 呢?

标签: objective-c


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    是的,选择器,即 SEL 对象,即使在实际方法尚未实现时也很可能存在。

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

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

    【讨论】:

    • 谢谢。所以我认为我问题的另一半的答案是不,你不能 NSLog 一个 SEL 类型的 var,但是你也不需要这样做。
    • 我不确定 SEL 类型的对象是否真的有描述,如果它是一个对象的话。但是您可以将其转换为您已经尝试过的字符串并对其进行 nslog。
    【解决方案3】:

    可能UIWindow 会检查选择器是否真的在self 中实现了

    - (BOOL)respondsToSelector:(SEL)aSelector
    

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

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 2011-12-24
      • 2017-04-07
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 2011-03-17
      相关资源
      最近更新 更多