Должен ли я использовать initWithString при распределении? - PullRequest
0 голосов
/ 27 июля 2011
NSString *str = [[NSString alloc]init];
str = [str initWithString:@""];

Этот код вылетает.Если я использую как показано ниже, это нормально.

NSString *str = [[NSString alloc]initWithString:@""];

Не могу ли я использовать initWithString после выделения?

Ответы [ 4 ]

6 голосов
/ 27 июля 2011

Вы реинициализируете память, которая уже была инициализирована посредством вашего вызова -init в первой строке.

NSString объекты неизменны , что означает, что их внутренний символьный буфер не может быть изменен каким-либо образом. Если вам нужна эта функциональность, используйте NSMutableString.

Следовательно, ваш код не имеет смысла для меня, потому что нет способа изменить строку, зачем создавать ее с пустой строкой?

Я предлагаю создать NSMutableString объект примерно так:

NSMutableString *str = [[NSMutableString alloc] init];

Затем вы можете поиграться со строкой различными методами (-setString:, replaceCharactersInRange:withString: и т. Д.)

Я не вижу другой причины, по которой вы когда-либо создали бы строку (которую вы владеете не менее), которая инициализируется пустым буфером.

4 голосов
/ 27 июля 2011

Ваш вопрос говорит о том, что вы не хотите размещать и инициализировать объект в одной строке кода. Это может быть в том случае, если у вас есть какая-то логика, которая инициализирует ее различными строками, и вы хотите поместить эту логику между выделением и инициализацией.

Метод + alloc - это метод, который выделяет объекты, -init инициализирует его. Не требуется, чтобы эти методы вызывались вместе, хотя это общее соглашение. Поэтому следующий код является допустимым и позволяет поместить код между выделением и инициализацией:

NSString *str = [NSString alloc];
str = [str initWithString:@""];

Другое довольно распространенное решение - разместить объявление указателя перед распределением, поэтому также справедливо следующее.

NSString *str = nil;
str = [[NSString alloc] initWithString:@""];

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

1 голос
/ 27 июля 2011

Это правильно:

 NSString *str = [[NSString alloc] initWithString:@""];

Вы не должны дважды вызывать метод init для объекта, как вы делаете в своем коде. Итак, вы просто инициализируете при выделении.

0 голосов
/ 27 июля 2011
NSString *str = [[NSString alloc] initWithString:@""];

правильно.Также помните, что всякий раз, когда вы используете alloc, copy или new, вы владеете объектом и должны в какой-то момент освободить его с помощью

[str release];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...