Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何正确使用makeObjectsPerformSelector:获取无法识别的选择器时出错_Objective C_Arrays_Selector - Fatal编程技术网

Objective c 如何正确使用makeObjectsPerformSelector:获取无法识别的选择器时出错

Objective c 如何正确使用makeObjectsPerformSelector:获取无法识别的选择器时出错,objective-c,arrays,selector,Objective C,Arrays,Selector,让我先说我对目标C是新手 我发现了错误 ATUMENUAPP[24288:303]-[\uu NSCFConstantString createListItem]:发送到实例0x100002450的无法识别的选择器 这是我的密码: selector = [NSMutableArray arrayWithObjects: @"nvda", @"aapl", @"goog", nil]; [selector makeObjectsPerformSelector:@selector(createLis

让我先说我对目标C是新手

我发现了错误 ATUMENUAPP[24288:303]-[\uu NSCFConstantString createListItem]:发送到实例0x100002450的无法识别的选择器

这是我的密码:

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

- (void)createListItem:(NSString *)title {
//do some stuff
}
现在,我已经做了大量的环顾四周,似乎这个问题的最大原因是增加或缺乏:然而,我确实相信我有适当的地方。也许我不太了解makeObjectsPerformSelector的用法,在查找文档后,我发现:

向数组中的每个对象发送由给定选择器标识的消息,从第一个对象开始,通过数组一直发送到最后一个对象


任何帮助都会很好,谢谢

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

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

[只有在阅读文档或思考了一下方法为何以这种方式命名,而不是那种方式命名,或者甚至试图理解错误消息时…]

NSArray的makeObjectsPerformSelector:withObject:方法执行它所建议的操作:它使数组的对象执行选择器,该选择器可以有一个可选参数。所以

[selector makeObjectsPerformSelector:@selector(createListItem:) withObject:self];
将向选择器数组中的每个NSString对象发送createListItem:消息,并将self作为其参数传递。它不会在对象中自动传递时执行选择器。也就是说,你所拥有的相当于

for (NSString *obj in selector) {
    [obj createListItem:self];
}
显然,与此相反,您需要以下内容:

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

[只有当您阅读了文档,或者考虑了一下为什么一个方法是这样命名而不是那样命名的,或者甚至试图理解错误消息时…]

NSArray的makeObjectsPerformSelector:withObject:方法执行它所建议的操作:它使数组的对象执行选择器,该选择器可以有一个可选参数。所以

[selector makeObjectsPerformSelector:@selector(createListItem:) withObject:self];
将向选择器数组中的每个NSString对象发送createListItem:消息,并将self作为其参数传递。它不会在对象中自动传递时执行选择器。也就是说,你所拥有的相当于

for (NSString *obj in selector) {
    [obj createListItem:self];
}
显然,与此相反,您需要以下内容:

for (NSString *obj in selector) {
    [self createListItem:obj];
}

你甚至不需要那种讨厌的方法。一个很好的循环快速枚举就可以了。

您误解了这个方法

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

因此,生成的调用类似于:

[@"nvda" createListItem:self];
...
很明显,NSString不存在该方法,因此出现了异常


如果需要对数组中的每个对象应用self方法,只需在其中循环即可。

您误解了该方法

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

因此,生成的调用类似于:

[@"nvda" createListItem:self];
...
很明显,NSString不存在该方法,因此出现了异常


如果需要对数组中的每个对象应用self方法,只需在其中循环即可。

+1。您看到,asker通过检查方法所采用的参数和数组的内容来反转参数。显然,我看得不够深入,所以我知道他们为什么会有例外,但不明白他们为什么认为自己的做法会奏效@谢谢你。这是如此不可抗拒的明显,以至于我有一种想回答的冲动:如果你没有回答,他们可能会
bly最终给出了十个答案,说NSString没有实现createListItem,他们最终会感到困惑。是的,这就是为什么我对文档感到困惑的原因。看起来好像我在运行对象中的已识别方法,但是从我在interent上所做的所有环视来看,人们似乎都在按照我想要的方式使用。谢谢你的澄清+1.您看到,asker通过检查方法所采用的参数和数组的内容来反转参数。显然,我看得不够深入,所以我知道他们为什么会有例外,但不明白他们为什么认为自己的做法会奏效@谢谢你。这是如此不可抗拒的明显,以至于我有一种想回答的冲动:如果你没有回答,他们可能会得到十个答案,说NSString没有实现createListItem,他们最终会感到困惑。是的,这就是为什么我对文档感到困惑的原因。看起来好像我在运行对象中的已识别方法,但是从我在interent上所做的所有环视来看,人们似乎都在按照我想要的方式使用。谢谢你的澄清!