gpt4 book ai didi

iphone - 参数和选择器

转载 作者:行者123 更新时间:2023-11-29 11:08:46 25 4
gpt4 key购买 nike

这是:

[self showInWindow:window];

此代码在 delay 之后调用的内容:

[self performSelector:@selector(showInWindow:)
withObject:window
afterDelay:delay];

还是我误解了这个方法?

编辑:我遇到的问题是方法 showInWindow 在延迟后被调用但表现得像 [self showInWindow:nil]。有什么建议吗?

最佳答案

是的,这就是所谓的。 (当然是在延迟之后。)

The documentation并没有真正解释“执行选择器”的含义,但它的含义正是您所怀疑的。

使用 performSelector:withObject: 类型的方法和直接发送消息之间有一个小区别:它们仅在对象实际上是一个对象(即 id,一个指向 Objective C 对象的指针)。但是 window 显然是一个对象。

(严格来说,这不完全正确。如果您传递与 id 大小相同或更小的内容,它通常会起作用。在某些情况下它不会。在某些情况下在某些情况下它会工作,但它是非法的。在某些情况下,它会工作并且是合法的,但 Apple 强烈建议不要这样做。没有任何情况下这是一个好主意 - 所以不要学习具体规则,只是假设它永远不会工作。提出这一点的唯一原因是,在 NeXT 时代,这曾经是 Objective C 中的常见做法,因此您今天可能偶尔还会在其他人的作品中看到它。)

有关 performSelector: 系列的更多信息,请参阅 NSObject Protocol Reference ,以及 SO 问题 Using -performSelector: vs. just calling the method . (有关 afterDelay: 变体的具体信息,请参阅上面链接的文档。)

从后来的编辑到问题:

the problem I'm having is that the method showInWindow get called after the delay but behaves like [self showInWindow:nil]. Any suggestion?

首先,它以何种方式“表现得像”参数为 nil?参数实际上是零吗? (只需将其记录在 showInWindow: 实现中;如果您还没有覆盖基础实现,只需添加一个记录和调用基础的覆盖。)

其次,如果它实际上为 nil,那么在您发送 performSelector:withObject:afterDelay: 时它是否为 nil?如果是这样,显然在发送选择器时它仍然是 nil。此外,请确保 window 确实是一个 id 而不是其他类型。 (请注意,如果您有共享名称 window 的成员、属性、全局变量和/或局部变量,您可能会混淆您指的是哪一个。这是常见的问题来源。 )

如果它在您安排它时实际上不是零,但在它到达时是零,则有几种可能发生的方式,但与这两种情况相比,它们的可能性都较小,调试起来也更棘手,所以让我们来判断他们先出来。

关于iphone - 参数和选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12535812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com