使用withObject:self和withObject:nil之间的区别

时间:2012-06-16 14:34:24

标签: iphone objective-c ios performselector

我一直想知道以下代码行

[self performSelector:@selector(myMethod) withObject:self afterDelay:1.0];
[self performSelector:@selector(myMethod) withObject:nil afterDelay:1.0];
  1. 上述两行代码之间的区别是什么。
  2. 我们应该何时将对象设置为nil,何时应将对象设置为self
  3. 在大多数情况下,我注意到要将对象设置为nil

4 个答案:

答案 0 :(得分:8)

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

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

对于带有多个参数的选择器,还有像performSelector:withObject:withObject:这样的方法。

答案 1 :(得分:3)

注意这两者之间的区别:

@selector(myMethod)
@selector(myMethod:)

第一个是不带任何参数的方法,第二个是带一个参数的方法。您正在使用的withObject:方法的performSelector:部分允许您在调用对象时将对象传递给方法。但是,如果该方法不采用任何参数,则无关紧要,因为它不会被使用。

答案 2 :(得分:0)

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

在第二个示例中,您传递了nil,因此该方法将nil传递给它不存在的参数,然后终止。从某种意义上讲,这是更“有效”的,因为你的方法不带参数,而且是“无”。该对象是否等效于NULL,那么无论如何都会通过忽略的绒毛。

答案 3 :(得分: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)的引用,就像您在示例中所做的那样。