我一直想知道以下代码行
[self performSelector:@selector(myMethod) withObject:self afterDelay:1.0];
[self performSelector:@selector(myMethod) withObject:nil afterDelay:1.0];
nil
,何时应将对象设置为self
?在大多数情况下,我注意到要将对象设置为nil
。
答案 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)的引用,就像您在示例中所做的那样。