Objective c 替换对象索引:withObject:错误

Objective c 替换对象索引:withObject:错误,objective-c,Objective C,有人能看到错误在哪里吗 NSArray *arr = [str componentsSeparatedByString:@","]; NSString *inputStr = [arr objectAtIndex:0]; NSString *trimmedStr = [inputStr stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharac

有人能看到错误在哪里吗

NSArray *arr = [str componentsSeparatedByString:@","];
NSString *inputStr = [arr objectAtIndex:0];
NSString *trimmedStr = [inputStr stringByTrimmingCharactersInSet:
                               [NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
[[arr objectAtIndex:0] replaceObjectAtIndex:0 withObject:trimmedStr];   
输出:

-[__NSCFString replaceObjectAtIndex:withObject:]: 
unrecognized selector sent to instance 0x68a8eb0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: '-[__NSCFString replaceObjectAtIndex:withObject:]: 
unrecognized selector sent to instance 0x68a8eb0'
编辑:添加额外的行以显示数组已声明和填充。
正如下面的评论所说,当我替换该行时:

[[arr objectAtIndex:0] replaceObjectAtIndex:0 withObject:trimmedStr];  
与:

Xcode错误(运行前):

这就是问题所在:

[[arr objectAtIndex:0] replaceObjectAtIndex:0 withObject:trimmedStr];
你真正想做的是:

[arr replaceObjectAtIndex:0 withObject:trimmedStr];
您正在向数组中的字符串([arr objectAtIndex:0])发送replaceObjectAtIndex,这显然是行不通的。将该消息发送到(可变)数组,它将用新字符串替换该字符串

对于你的下一个问题:告诉我们更多关于你想做什么等,不要限制自己少于10个单词。你给予的细节越多,你得到的帮助就越多。

这就是问题所在:

[[arr objectAtIndex:0] replaceObjectAtIndex:0 withObject:trimmedStr];
你真正想做的是:

[arr replaceObjectAtIndex:0 withObject:trimmedStr];
您正在向数组中的字符串([arr objectAtIndex:0])发送replaceObjectAtIndex,这显然是行不通的。将该消息发送到(可变)数组,它将用新字符串替换该字符串


对于你的下一个问题:告诉我们更多关于你想做什么等,不要限制自己少于10个单词。您提供的详细信息越多,您将得到越多的帮助。

虽然我不确定您正在尝试做什么(因为我不知道
arr
是什么),但您似乎从数组中获得了一个
NSString
对象,并试图对其执行
replaceObjectAtIndex:withObject:
。也许你的意思是:

[arr replaceObjectAtIndex:0 withObject:trimmedStr];

虽然我不确定您正在尝试做什么(因为我不知道
arr
是什么),但似乎您正在从数组中获取一个
NSString
对象,并试图对其执行
replaceObjectAtIndex:withObject:
。也许你的意思是:

[arr replaceObjectAtIndex:0 withObject:trimmedStr];

为了方便起见,以下是正确的修复方法:

NSMutableArray *arr = [[[str componentsSeparatedByString:@","] mutableCopy] autorelease];
NSString *inputStr = [arr objectAtIndex:0];
NSString *trimmedStr = [inputStr stringByTrimmingCharactersInSet:
                           [NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
[arr replaceObjectAtIndex:0 withObject:trimmedStr];   
或者,如果您使用的是ARC:

NSMutableArray *arr = [[str componentsSeparatedByString:@","] mutableCopy];
NSString *inputStr = [arr objectAtIndex:0];
NSString *trimmedStr = [inputStr stringByTrimmingCharactersInSet:
                           [NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
[arr replaceObjectAtIndex:0 withObject:trimmedStr];   

为了方便起见,以下是正确的修复方法:

NSMutableArray *arr = [[[str componentsSeparatedByString:@","] mutableCopy] autorelease];
NSString *inputStr = [arr objectAtIndex:0];
NSString *trimmedStr = [inputStr stringByTrimmingCharactersInSet:
                           [NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
[arr replaceObjectAtIndex:0 withObject:trimmedStr];   
或者,如果您使用的是ARC:

NSMutableArray *arr = [[str componentsSeparatedByString:@","] mutableCopy];
NSString *inputStr = [arr objectAtIndex:0];
NSString *trimmedStr = [inputStr stringByTrimmingCharactersInSet:
                           [NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
[arr replaceObjectAtIndex:0 withObject:trimmedStr];   

这就是我一开始的想法,我同意这更有意义,但Xcode给出了一个错误:“对于'NSArray',没有可见的@interface声明选择器'replaceObjectAtIndex:withObject'。因为NSArray是不可变的,不知道如何更改其内容。事实上,
[str componentsSeparatedByString:@',”
返回这样一个不可变的数组,您将无法替换其中的任何项。如果您想修改该数组,您必须使用
-mutableCopy
@Julien从中创建一个NSMutableArray是的,当我将类型更改为mutable时,它发出了警告,但运行正常。+1表示mutableCopy。感谢它能够正常工作提供了一个实现细节(这并不完全令人惊讶,
-componentsSeparatedByString:
使用可变数组并按原样返回,但这可能会在将来发生变化,最终导致崩溃。这是我最初的想法,我同意这更有意义,但Xcode给出了一个错误:“NSArray”没有可见的@interface声明选择器“replaceObjectAtIndex:withObject”。因为NSArray是不可变的,并且不知道如何更改其内容。事实上,
[str componentsSeparatedByString:@,“]
返回这样一个不可变的数组,您将无法替换其中的任何项。如果您想修改该数组,您必须使用
-mutableCopy
@Julien从中创建一个NSMutableArray是的,当我将类型更改为mutable时,它发出了警告,但运行正常。+1表示mutableCopy。感谢它能够正常工作提供了一个实现细节(毫不奇怪,
-componentsSeparatedByString:
使用可变数组并按原样返回,但这可能会在将来发生变化,最终会崩溃。+1表示弧和非弧,也类似于可变副本位于同一行:)+1对于圆弧和非圆弧,也类似于可变副本位于同一行:)