performSelector不会将对象传递给选择器

时间:2010-12-06 09:20:38

标签: iphone nsobject

我想要传递一个NSSet对象performSelector - 调用:

NSSet *myNSSetObject = [self getSet];

if (myNSSetObject.count != 1)
    return;

[self performSelector:@selector(myMethod:) withObject:myNSSetObject afterDelay:0.5];

问题是对象在myMethod中到空。由于performSelector保留了传递的Object,我不明白出了什么问题。

我的方法定义如下

- (void)myMethod:(NSSet *)myNSSetParam {
   NSLog(@"Set count: %d", myNSSetParam.count);
   [do sth];
}

NSLog显示: 设定数:0


深入研究这个问题并且已经通过上面的计数建议,实际上传递了NSSet对象,但丢失了它的记录。

是不是NSSet保留了它的对象?

5 个答案:

答案 0 :(得分:1)

myMethod是否真的采取了争论?值得注意的是,Objective-C中的方法名称和选择器实际上包含声明中存在的冒号;因此,这样的方法:

 - (void)myMethod:(NSSet *)set;
必须使用@selector(myMethod:)引用

,包括尾部冒号。

答案 1 :(得分:1)

从第一条消息返回后(或部分在发布的代码片段下方),您是否意外更改NSSet发送的[self getSet]?如果您之后从集合中删除对象,myMethod:将无法再访问它。

答案 2 :(得分:0)

你应该致电

[self performSelector:@selector(myMethod:) withObject:myNSSetObject afterDelay:0.5];
而是

(注意消息名称后面的冒号)。

答案 3 :(得分:0)

你的意思是

[self performSelector:@selector(myMethod:) withObject:myNSSetObject afterDelay:0.5]

假设myMethod:是一个获取对象的方法?

答案 4 :(得分:0)

你确定getSet返回一个实际的NSSet而不是隐藏在NSSet“基指针”下的可变子类吗?如果它是可变的,则可以在0.5秒延迟内修改该组。即使performSelector:withObject:afterDelay:保留了该集合,也不会阻止它被修改。