self.filteredProducts = [[NSMutableArray alloc] init];
//Find products
self.filteredProducts = (NSMutableArray*)[(NSMutableDictionary *)[self.CECategoriesDictionary objectForKey:category.categoryGuid] allValues];
if([self.oldfilteredProducts count] > 0 && selectedLevel==5)
{
NSMutableArray *diff = [self.filteredProducts mutableCopy];
[diff removeObjectsInArray:[NSArray arrayWithArray:self.oldfilteredProducts]];
[self.filteredProducts removeObjectsInArray:[NSArray arrayWithArray:diff]];
}
日志:
[__ NSArrayI removeObjectsInArray:]:无法识别的选择器发送到实例0x1aed19d0 2014-09-15 22:00:19.243 SAPRetailEx [10325:90b] [错误]:未捕获异常: - [__ NSArrayI removeObjectsInArray:]:无法识别的选择器发送到实例0x1aed19d0 2014-09-15 22:00:19.243 SAPRetailEx [10325:90b] [错误]: - [__ NSArrayI removeObjectsInArray:]:无法识别的选择器发送到实例0x1aed19d0 2014-09-15 22:00:19.248 SAPRetailEx [10325:90b] [错误] :(
答案 0 :(得分:5)
您无法从NSArray
删除对象;我知道你认为你使用的是NSMutableArray
,但事实并非如此。从错误[__NSArrayI removeObjectsInArray:]: unrecognized selector
可以清楚地看出这一点; __NSArrayI
是一个不可变对象(这就是I
的含义),如果这是一个可变数组,那么该类将是__NSArrayM
。
您似乎在错误的印象下操作,即只需将NSArray
转换为NSMutableArray
即可获得可变数组;这已经永远不会如何在任何C派生语言下运行。您需要向mutableCopy
发送NSArray
消息。当然,您现在拥有阵列的副本,因此修改不会反映在原始版本中。您还拥有该副本,因此如果您不使用ARC,则在完成后需要release
副本。
我很想知道为什么你已经mutableCopy
self.filteredProducts
,然后还试图直接从self.filteredProducts
删除。即使你按照预期的方式工作,你现在正在无缘无故地复制阵列,然后从你和原来的#34;和#34;复制"。
答案 1 :(得分:0)
self.filteredProducts
不是NSMutableArray
它只是一个普通的NSArray
,它没有"删除选项"
[self.filteredProducts removeObjectsInArray:[NSArray arrayWithArray:diff]
为了将来的帮助...在分配代码后设置代码中的断点,然后打印出描述并查看它实际是什么类型的对象。调试器中的po
或右键单击"打印说明"。不要相信左侧面板上的内容,这就是您告诉代码对象的内容,请查看右侧的说明,了解它的真实含义。