2010-08-31 2 views
0

Почему substringFromIndex не работает для моего NSMutableString?Использование 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]; 

Это, как я думал, приведет к сбою, так как я использовал setString на NSMutableString, что мне не нужен NSString, и я его выпустил, но, видимо, это не так, однако, если я использую autorelease, будет ОК

ответ

4

Этот метод никогда не изменяет строку, на которую вы ее называете. Он возвращает новую строку в обоих случаях. Поэтому назначьте его новой строковой переменной и вашему хорошему.


Это грохот, потому что вы освобождаете один объект и просачиваете другой. Вы выполните alloc первую строку, затем создайте новую строку с автореализацией от substringFromIndex:, а затем отпустите ее. Вам не нужно очень стараться.

Просто назначьте выход метода подстроки переменной и пусть он будет автореализован для вас. Нет выделения, нет выпуска.


Полный правильный пример может выглядеть следующим образом:

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]; 
+0

Но почему это не позволяет мне делать: myString = [myString substringFromIndex: 5]; Почему это переопределяет, если я освобождаю tempStr, так как мне больше не нужен tempStr, но мне понадобится myString еще немного ... – Ladislav

+1

'[[NSString alloc] init]' инициализирует новый строковый объект. Но 'substringFromIndex:' возвращает совершенно другой строковый объект. Таким образом, тот, который вы только что создали, никогда не используется. И что еще хуже, это утечка, так как вы никогда не выпускаете этот объект. Объекты, возвращаемые из методов, автореализовываются. Смысл они освобождают себя, когда он безопасен. Таким образом, вы освобождаете этот объект с автореализованной строкой, и когда автореферат позже запускает его, он уже был освобожден, и вы получаете сбой. –

+0

Есть ли разница в использовании NSMutableString или NSString в случае, если вы хотите либо подстроки, либо если вы хотите добавить к ней строки? NSString имеет stringByAppendingString и NSMutableString имеет appendString ... – Ladislav

1

[myString substringFromIndex:5] возвращает новый NSString, который начинается с указанного индекса. Он не изменяет myString.

попробуйте этот код вместо:

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

Вы создаете NSMutableString специально, чтобы вы CAN изменить его.

Но никто не знает, какой-либо способ сделать это:

[myMutableString substringFromIndex: 5];

И если вы собираетесь сделать это вместо:

myMutableString = [myMutableString substringFromIndex: 5];

Почему даже использовать mutable в первую очередь.

MutableStrings отлично подходит для ДОБАВЛЕНИЕ (добавление) к ним.

Не знаете, почему мы не можем также сократить (подстроить) их. (Без создания новой копии.)

Смежные вопросы