2010-05-27 4 views
2

У меня есть процедура, которая анализирует текст через цикл. В конце каждой записи мне нужно очистить свои строковые переменные, но я прочитал, что someString = @ "" на самом деле просто указывает на новую строку & вызывает утечку памяти.Лучший способ инициализировать/очистить строковую переменную какао

Каков наилучший способ справиться с этим? Должен ли я использовать mutable string vars и использовать setString: @ "" между итерациями?

+1

Это зависит от первого создания someString. Если этот парень определит его с помощью someString = [[NSString alloc] init], тогда сделайте someString = @ "", он просочет память – vodkhang

ответ

1

Вы должны быть осторожны, в этом случае вы создаете NSString: (метод фабрики) или (Alloc инициализации или (с помощью @ «».)

Если вы используете @ «», это постоянная строка, смотрите здесь: Constant NSString

Если вы используете [[NSString Alloc] инициализации], вам нужно освободить it.You просто нужно сделать [релиз] SomeString

Если вы используете что-то вроде [NSString stringWithFormat:. @» "], вам не нужно его выпускать, потому что он уже отключен автоматически во время выполнения

+0

Форматирование будет уничтожено, надеюсь, это разборчиво ------------ ---------------------------------------- Что относительно объекта, объявленного с сохранением свойства @property (неатомный, сохраняющий) NSString * someString; -------------------------------- затем присвоено значение с помощью копии someString = [parsedCharacters copy]; ------------------ и очищается с постоянным присвоением строки someString = @ ""; Извините, если мои вопросы кажутся глупыми, но что-то здесь немного не так, свойство сохранения должно иметь соответствующую версию, но релиз вызывает сбои. Что я испортил? –

+0

1st: Свойство используется, только если вы используете self.someString, это просто нормальное назначение. Теперь вы не используете себя. 2nd: если вы назначили someString константной строке, например @ "", вы не должны ее выпускать, пожалуйста, взгляните на ссылку еще раз. Даже если вы используете self.someString = @ "", вы также не должны его выпускать – vodkhang

+0

Я думаю, что, наконец, понимаю это, если я просто назначаю литералы и использую фабричные методы, то объект не нужно выпускать. Даже если он объявлен с сохранением собственности, это правильно? –

0

Поскольку NSStrings неизменяемы, вы не можете изменить содержимое строки. И, инициализируя его с помощью @ "", вы на самом деле создаете постоянный объект NSString.

Вы можете либо работать с локальным узлом NSString в цикле, либо выпустить его в конце цикла, либо вместо него использовать NSMutableString. Однако я предпочел бы локальную строку цикла.

for (; ;) { 
    NSString* str = [[NSString alloc] initWithFormat:@"%@", CONTENT]; 
    ... 
    [str release]; 
} 
Смежные вопросы