1

我一直想知道以下代码行

[self performSelector:@selector(myMethod) withObject:self afterDelay:1.0];
[self performSelector:@selector(myMethod) withObject:nil afterDelay:1.0];
  1. 以上两行代码有什么区别。
  2. 我们什么时候应该将object设置为nil,什么时候应该将object设置为self

在大多数情况下,我注意到要设置为的对象nil

4

4 回答 4

8

在您列出的示例中,您不会遇到任何不同的行为,因为您的方法myMethod没有参数。这很有用,是当你有一个带参数的方法时。

假设我们声明了一个方法,squareRootMethod:它接受一个 NSNumber 并返回平方根。然后你会打电话[self performSelector:@selector(squareRootMethod:) withObject:numberToRoot afterDelay:1.0]

还有一些方法,如performSelector:withObject:withObject:用于选择器的方法,它接受多个参数。

于 2012-06-16T14:41:48.500 回答
3

注意这两者之间的区别:

@selector(myMethod)
@selector(myMethod:)

第一个是不带任何参数的方法,第二个是带一个参数的方法。您正在使用的方法withObject:部分performSelector:允许您在调用该方法时将对象传递给该方法。但是,在该方法不带任何参数的情况下,它并不重要,因为它不会被使用。

于 2012-06-16T15:21:38.270 回答
0

在第一个示例中,您将 self 作为参数传递给调用该方法的方法。但是你的方法没有参数,所以它是不必要的。

在第二个示例中,您传递了nil,因此该方法被传递nil给它不存在的参数,然后终止。从某种意义上说,这更“有效”,因为您的方法不接受任何参数,并且 `nil. 对象是否等效于 NULL,那么您传递的绒毛较少,无论如何都会被忽略。

于 2012-06-16T14:38:34.700 回答
0

区别在于您是否将对象传递给选择器。选择器所做的只是描述一个方法。

[self performSelector:@selector(myMethod) withObject:nil afterDelay:1.0];

不同于:

[self performSelector:@selector(myMethod:usingThis:) withObject:nil afterDelay:1.0];

现在,如果您希望选择器(即方法)对您传入的某个对象起作用,例如数组、字典或类。您使用 withObject。如:

[self performSelector:@selector(myMethod:) withObject:myDictionary afterDelay:1.0];

-(void)myMethod:(NSDictionary*)dictionary
{
// Do something with object
}

您可以传入任何内容,包括对当前类的引用(例如 self),就像您在示例中所做的那样。

于 2012-06-16T14:51:53.740 回答