首先让我说我是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.
任何帮助都会很棒,谢谢!
答案 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
,并期望能够调用fly
在Car
的实例上;只有Helicopter
才能使用它。我建议你阅读一本关于Objective-C的好书,并进一步熟悉类,实例和实例方法。
答案 2 :(得分:1)
你误解了这个方法。
它会在createListItem:
的每个对象上使用参数self
调用方法NSArray
。
因此产生的调用类似于:
[@"nvda" createListItem:self];
...
显然,NSString
不存在该方法,并且会出现异常。
如果您需要将self
的方法应用于数组中的每个对象,只需循环遍历它。