0

我有一个 NSSet 对象,我想通过performSelector-call 传递:

NSSet *myNSSetObject = [self getSet];

if (myNSSetObject.count != 1)
    return;

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

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

我的方法定义如下

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

NSLog 显示:设置计数:0


深入研究这个问题并且上面的计数已经表明,NSSet 对象实际上是通过的,但是会丢失它的记录。

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

4

5 回答 5

1

是否myMethod真的有争论?需要注意的是,Objective-C 中的方法名称和选择器实际上包含了声明中的冒号。因此,像这样的方法:

 - (void)myMethod:(NSSet *)set;

必须用 引用@selector(myMethod:),包括结尾的冒号。

于 2010-12-06T09:24:30.487 回答
1

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

于 2010-12-06T21:11:53.253 回答
0

你应该打电话

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

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

于 2010-12-06T09:25:07.970 回答
0

你的意思是

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

假设myMethod:是一个接受对象的方法?

于 2010-12-06T09:27:44.310 回答
0

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

于 2010-12-06T21:23:50.097 回答