Objective c 为什么removeObject在删除空字符串元素时引发异常?

Objective c 为什么removeObject在删除空字符串元素时引发异常?,objective-c,nsmutablearray,Objective C,Nsmutablearray,我正在尝试使用以下方法从NSMutableArray对象中删除包含空格的任何元素: [searchCriteria removeObject:[NSString stringWithString:@" "]]; 我得到异常“-[\uu NSArrayI removeObject:]:无法识别的选择器发送到实例”。我做错了什么 编辑: 好的,我试了以下方法 NSPredicate* predicate = [NSPredicate predicateWithFormat:@"SELF NOT C

我正在尝试使用以下方法从NSMutableArray对象中删除包含空格的任何元素:

[searchCriteria removeObject:[NSString stringWithString:@" "]];
我得到异常“-[\uu NSArrayI removeObject:]:无法识别的选择器发送到实例”。我做错了什么

编辑: 好的,我试了以下方法

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"SELF NOT CONTAINS ' '"];
NSArray *nonEmptyElements = [searchCriteria filteredArrayUsingPredicate: predicate];
并获取无法分析格式字符串“SELF NOT CONTAINS”“的错误


如何在CONTAINS之后指定空字符串?

您应该使用NSPredicate来过滤掉任何带有空格的项目。 请参见此处的操作方法:


但是,您应该使用self-contains谓词,而不是示例中使用的self-begins。 请参见此处的操作方法:


但是,您应该使用self-contains谓词,而不是self-begins,因为示例使用了.l

您有一个普通的NSArray,而不是NSMutableArray。可能在某个时候,您认为自己拥有的NSMutableArray被复制或序列化,从而产生了一个不可变的数组


顺便说一句,正如Lefteris所说,这将过滤掉只包含一个空格的字符串。要过滤掉任何有空格的字符串,你需要按照他说的方式来做。如果您确实想筛选出单空格字符串,只需编写
@“
而不是
[NSString stringWithString:@”“]
——这是完全等效的。

您有一个普通的NSArray,而不是NSMutableArray。可能在某个时候,您认为自己拥有的NSMutableArray被复制或序列化,从而产生了一个不可变的数组


顺便说一句,正如Lefteris所说,这将过滤掉只包含一个空格的字符串。要过滤掉任何有空格的字符串,你需要按照他说的方式来做。如果您确实想筛选出单空格字符串,只需编写
@“
而不是
[NSString stringWithString:@]”就可以了
-这完全是等效的。

这不是删除包含“空格”字符的对象的方式。这不是删除包含“空格”字符的对象的方式。我确实希望删除仅包含空空格的元素。该数组是使用(NSMutableArray*)[searchText componentsSeparatedByString:@”“]创建的,它应该将结果强制转换为NSMutableArray,对吗?@ChrisP:Nah,不能这样强制转换对象。对象总是由指针表示,将指针从一种类型转换到另一种类型不会改变它所指向的实际对象。要将数组转换为NSMutableArray,您需要从
[searchText mutableCopy]
获取一个数组(如果不使用ARC,请不要忘记在完成后释放可变数组)。感谢Chuck的说明。这才是问题的根源。我来自C#,在那里,演员阵容实际上会将搜索文本转换为可变文本。@ChrisP:是的,这让很多人感到惊讶。Objective-C的特点是,在大多数情况下,它只是C语言,有一点新的语法用于定义类和发送消息。一般来说,特征要么是C,要么是Objective-C,而C不知道对象。因此,C语言中类似于铸造的东西仍然与C语言中的工作方式相同。C语言没有这个包袱,因此它可以将对象烘焙到语言的核心。(Objective-C正朝着这个方向发展,例如,命名属性和装箱支持,但随着语言即将迎来30岁生日,Objective-C才刚刚获得了这些东西!)我确实想删除只包含一个空白的元素。该数组是使用(NSMutableArray*)[searchText componentsSeparatedByString:@”“]创建的,它应该将结果强制转换为NSMutableArray,对吗?@ChrisP:Nah,不能这样强制转换对象。对象总是由指针表示,将指针从一种类型转换到另一种类型不会改变它所指向的实际对象。要将数组转换为NSMutableArray,您需要从
[searchText mutableCopy]
获取一个数组(如果不使用ARC,请不要忘记在完成后释放可变数组)。感谢Chuck的说明。这才是问题的根源。我来自C#,在那里,演员阵容实际上会将搜索文本转换为可变文本。@ChrisP:是的,这让很多人感到惊讶。Objective-C的特点是,在大多数情况下,它只是C语言,有一点新的语法用于定义类和发送消息。一般来说,特征要么是C,要么是Objective-C,而C不知道对象。因此,C语言中类似于铸造的东西仍然与C语言中的工作方式相同。C语言没有这个包袱,因此它可以将对象烘焙到语言的核心。(Objective-C正朝着这个方向发展,例如命名属性和装箱支持,但随着语言即将迎来30岁生日,Objective-C才刚刚获得了这些东西!)尽管事实证明我不需要使用NSPredicate,但了解它的功能会有所帮助。谢谢Lefteris。虽然事实证明我不需要使用NSPredicate,但了解它的功能是很有帮助的。谢谢左撇子。