在NSMutableString上使用substringFromIndex

时间:2010-08-31 10:01:27

标签: ios objective-c

为什么substringFromIndex无法使用NSMutableString

这里的代码类似于我的代码:

NSMutableString *myString = [[NSMutableString alloc] initWithString:@"This is my String"];

[myString substringFromIndex:5];

NSLog(@"myString = %@", myString); //will output This is my String

如果我在substringFromIndex上使用NSString它会起作用,例如:

NSString *tempStr = [[NSString alloc] init];
tempStr = [myString substringFromIndex:5]; 
NSLog(@"tempStr = %@", tempStr); //will output is my String 

为什么它在第一个例子中不起作用,我还有一个问题,如果我使用第二个方法,然后我设置:

[myString setString:tempStr];
[tempStr release];

这会导致崩溃,我想,因为我在NSMutableString上使用了setString,我不需要NSString并且我释放它,但显然事实并非如此,但是如果我用autorelease就可以了

3 个答案:

答案 0 :(得分:4)

该方法永远不会改变您调用它的字符串。它在两种情况下都返回一个新字符串。所以将它分配给一个新的字符串变量和你的好。


它崩溃了,因为你过度释放一个物体并泄漏另一个物体。您alloc第一个字符串,然后从substringFromIndex:创建一个新的自动释放字符串,然后释放它。你不需要这么努力。

只需将substring方法的输出分配给变量,然后让它自动释放。没有分配,没有发布。


完整正确的示例可能如下所示:

NSMutableString *myString = [[NSMutableString alloc] initWithString:@"This is my String"];
NSString *tmpString = [myString substringFromIndex:5];
NSLog(@"tempStr = %@", tempString);
[myString setString:tempStr];

// later do [myString release]

甚至更简单:

NSString *myString = @"This is my String";
myString = [myString substringFromIndex:5];

答案 1 :(得分:2)

您专门创建一个NSMutableString,以便您 CAN 修改它。

但没有人知道如何做到这一点:

  

[myMutableString substringFromIndex:5];

如果你打算这样做:

  

myMutableString = [myMutableString substringFromIndex:5];

为什么甚至首先使用mutable。

MutableStrings非常适合 ADDING (追加)给他们。

不确定为什么我们也不能缩短(子串)它们。 (没有制作新的副本。)

答案 2 :(得分:1)

[myString substringFromIndex:5]返回从指定索引开始的新NSString。它不会修改myString

尝试使用此代码:

NSLog(@"myString = %@", [myString substringFromIndex:5]);