如何正确使用makeObjectsPerformSelector:获取错误无法识别的选择器

时间:2012-12-30 23:58:24

标签: objective-c arrays selector

首先让我说我是Objective C.的新手。

我收到错误 atusMenuApp[24288:303] -[__NSCFConstantString createListItem]: unrecognized selector sent to instance 0x100002450

这是我的代码:

selector = [NSMutableArray arrayWithObjects: @"nvda", @"aapl", @"goog", nil];
[selector makeObjectsPerformSelector:@selector(createListItem:) withObject:self];

- (void)createListItem:(NSString *)title {
//do some stuff
}

现在我已经做了很多环顾四周,这个问题的最大原因似乎是:的增加或缺乏,但我相信我已经适当地实现了这一点。也许我不太了解makeObjectsPerformSelector的使用情况,因为在查找了我发现的文档之后:

Sends to each object in the array the message identified by a given selector, starting with the first object and continuing through the array to the last object.

任何帮助都会很棒,谢谢!

3 个答案:

答案 0 :(得分:5)

[只有当你阅读文档时(或者想一下为什么方法以这种方式命名而不是那个),或者甚至努力尝试理解错误信息...]

makeObjectsPerformSelector:withObject:的{​​{1}}方法做了它的建议:它使 数组的对象 执行选择器,有一个可选的参数。所以

NSArray

会将[selector makeObjectsPerformSelector:@selector(createListItem:) withObject:self]; 消息发送到createListItem:数组中 每个NSString对象 并传入{{1}作为它的论点。 它不会在传递对象的selector上执行选择。 I. e。,你所拥有的相当于

self

显然,您需要以下内容代替:

self

你甚至不需要这种令人讨厌的方法。一个很好的快速枚举for (NSString *obj in selector) { [obj createListItem:self]; } 循环就可以了。

答案 1 :(得分:1)

首先制作一个NSString的数组。然后,您向他们发送所有消息createListItem。这一切都很好,但是NSString没有任何名为createListItem的方法;仅仅因为你定义了一个名为createListItem的实例方法并不意味着每个类的每个实例都可以使用它。只有具有该定义的实现文件的类才能处理该消息。例如,我无法列出Car个实例,然后在另一个名为fly的实现中定义方法Helicopter,并期望能够调用flyCar的实例上;只有Helicopter才能使用它。我建议你阅读一本关于Objective-C的好书,并进一步熟悉类,实例和实例方法。

答案 2 :(得分:1)

你误解了这个方法。

它会在createListItem:的每个对象上使用参数self调用方法NSArray

因此产生的调用类似于:

[@"nvda" createListItem:self];
...

显然,NSString不存在该方法,并且会出现异常。

如果您需要将self的方法应用于数组中的每个对象,只需循环遍历它。