2012-06-15 2 views
4

Я смущен между NSString и NSMutable использование строки. Предположим, что у меня есть переменные экземпляра одного и двух объявленный в классе, как это:Использование NSMutableString vs NSString?

NSString *one; 
NSMutableString *two; 

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

позволяет сказать, что я изменил свою «две» строки, подобные этим:

 1. [two appendString:@"more string"]; 
    2. two = @"string" 
    3. self.two = @"string" 

Вопросы:

  1. будет первой линии выпуска предыдущей строки и выделить новый объект и присвоить ей значение. Если да, значит, это означает, что создание геттеров и сеттеров в этом случае не нужно? ИЛИ его не нужно создавать свойства в NSMutablestring

  2. В этом случае будет выделен предыдущий выделенный строковый объект?

  3. Он уверен, что первый объект будет выпущен, поскольку мы вызываем сеттеры здесь. этот код необходим или мы можем просто использовать строку кода 2 для назначения строки.

Теперь о NSString: Как можно изменить строку, как это также:

one = [one stringByAppendingString:@" more string"]; 
    self.one = [one stringByAppendingString:@" more string"]; 

Что лучше с помощью NSMutablestring или NSString?

Извините за длинный пост, но мне нужно было понять эти понятия.

ответ

3

Для первой части вашего вопроса:

  1. Почти определенно нет. Я ожидаю, что память будет распределяться динамически, а не выпущена и перераспределена.

  2. Если предыдущий ответ отрицательный, это также нет.

  3. Второй и третий варианты даже не работают с предупреждением Incompatible pointer types assigning NSMutableString to NSString

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

Ваши мнения NSMutableString, кажется, что будет делать в stringBy.. методы NSString:

С NSString и его stringBy... методы, вы создаете новые объекты, освобождая старую (в случае необходимости) и сделать новый объект автореферат.(Будьте осторожны, если вы переходите от неавтореально к авторекламе, у вас может быть релиз в вашем dealloc, который больше не нужен)

+0

Очень хорошее понимание действительно. Один вопрос: если я использую метод stringBy в NSString, а память управляется самим временем выполнения, тогда мне нужно создать свойства для моего NSString? В этом случае возникает ненужная задача создания свойств? – user1374408

+0

Какие свойства вы планируете сделать? –

+0

nonatomic, keep – user1374408

2

NSMutableStringNSMutableString сохранит некоторую память как объекты NSString всегда постоянные. Поэтому переопределение нового значения в переменную NSString будет выделять новую память для новой строки.

Однако обратите внимание на несколько ошибок в коде. Вы должны инициализировать объекты перед отправкой им сообщения:

// this won't work 
NSString *one; 
[one stringByAppendingString:@"more string"]; 

// nor this 
NSMutableString *two; 
[two appendString:@"more string"]; 

// first do this: 
NSString *one = @"an initial string constant"; // or 
NSString *one = [NSString string]; 

NSMutableString *two = [NSMutableString string]; 
+1

извините за это. но я пропустил эту часть кода, поскольку мои вопросы были связаны с модификацией строк, и я подумал, что мы можем принять эту часть. – user1374408

2

NSString объекты неизменны это означает, что, когда вы «изменить» в NSString вы на самом деле создает новую строку и не изменяя старый, который не является очень эффективный. С NSMutableString строка хранится в буфере, чем может быть изменена.

Итак, простое правило состоит в том, что если вам нужно каким-либо образом изменить строку, используйте NSMutableString, а если нет NSString. Вы также можете бросить NSMutableString к NSString, но не наоборот (то вам нужно сделать копию)

+0

я это понимаю.Но я хотел понять, что внутренняя работа и dodnt хотели просто изучить правила, не понимая их реального применения. В любом случае, спасибо! – user1374408

+0

Если 'NSMutableString' можно изменить, а' NSString' не может, почему бы вам использовать 'NSString'? Есть ли у «NSString» некоторые преимущества перед «NSMutableString»? –

3

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

, когда вы делаете [two appendString:@"more string"], указатель по-прежнему указывает на то же место в памяти, и вам не нужно беспокоиться о распределении или освобождении.

Когда вы делаете two = @"string", это означает, что вы указали указатель на указатель на определенное место в памяти, которое содержит статическую строку со значением «строка» внутри.

Когда вы делаете self.two = @"string", у вас уже есть свойство с именем two declare. Используя свойство в xcode, вам не нужно беспокоиться о памяти, поскольку вы уже указали в объявлении свойства. Это хороший инструмент xcode предоставляет вам, и вы обязательно должны использовать его, когда сможете.

+0

Другие слова: с помощью ARC вы можете использовать оба класса NSString и не беспокоиться об этом, но в некоторые моменты, когда лучше сохранять память (например, динамические ячейки с большим количеством динамических строк), вы должны использовать NSMutableString. –

0

Разница между NSMutableString и NSString является то, что:

NSMutableString: NSMutableString объектов предоставляют методы для изменения основного массива символов, которые они представляют, в то время как NSString не делает. Например, NSMutableString предоставляет такие методы, как appendString, deleteCharactersInRange, insertString, replaceOccurencesWithString и т. Д. Все эти методы работают со строкой, поскольку она существует в памяти. Мы можем изменить значение valsue объекта во время выполнения.

NSString: с другой стороны, только если вы хотите, это только строка с именем «только один раз»; вы обнаружите, что все его методы «манипуляции» (подстрока, uppercaseString и т. д.) возвращают другие объекты NSString и никогда не изменяют существующую строку в памяти.