Когда не выделять и инициировать NSString - PullRequest
5 голосов
/ 27 сентября 2010

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

Ответы [ 4 ]

18 голосов
/ 27 сентября 2010

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

Нет, это не имеет смысла.

переменная существует с момента, когда программа обнаружит точку, в которой вы ее объявили:

NSString *myString;

Эта переменная не является строкой NSString.Это хранилище для указателя на строку NSString.Вот что указывает *: эта переменная содержит указатель.

NSString объект существует только с момента его создания:

[[NSString alloc] init];

иуказатель на этот объект находится только в переменной с того момента, как вы его там присвоили:

myString = [[NSString alloc] init];
//Or, initializing the variable in its declaration:
NSString *myString = [[NSString alloc] init];

Таким образом, если вы собираетесь получить строковый объект откуда-то еще (например, substringWithRange:), выможете пропустить создание новой, пустой, потому что вы просто собираетесь заменить указатель на пустую строку указателем на другую.

Иногда вы хотите создать пустую строку;например, если вы собираетесь получать несколько строк по одной (например, из NSScanner) и хотите объединить некоторые или все из них в одну большую строку, вы можете создать пустую изменяемую строку (используя alloc и init) и отправьте ему appendString: сообщений для выполнения конкатенации.

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

12 голосов
/ 27 сентября 2010

Если вы хотите инициализировать его известным значением, использование alloc не имеет смысла, вы можете просто использовать строковый литерал:

NSString* myStr = @"Some value";

Если вы хотите инициализировать его с форматомили что-то еще, но не нужно, чтобы оно выходило за пределы текущего времени жизни пула автоматического выпуска, немного удобнее использовать удобные методы класса:

NSString* myTempStr = [NSString stringWithFormat:@"%d", myIntVar];

Если вам нужно, чтобы его время жизни выходило за рамки этого, либоalloc / init или добавьте retain к предыдущему вызову.Я предпочитаю немного предпочесть последнее, но оба в значительной степени эквивалентны.В любом случае вам понадобится балансировка release позже.

Обратите внимание, что, поскольку NSString не является изменяемым, такие вещи не только не нужны, но и активно неправильно :

// don't do this!
NSString* myStr = [[NSString alloc] initWithString:@""];
myStr = someOtherStr;

, поскольку утечка исходного значения заполнителя.

4 голосов
/ 27 сентября 2010

Кажется, бывают моменты, когда ты не хочешь этого делать.

Я не могу вспомнить, когда бы я захотел бы выделить / инициализировать строку NSString. Поскольку NSStringgs являются неизменяемыми, вы почти всегда создаете новые строки одним из следующих способов:

  • метод класса удобства, например

    NSString* foo = [NSString stringWithFormat:...];
    
  • буквальным

    NSString* foo = @"literal";
    
  • Метод экземпляра NSString

    NSString* foo = [bar uppercaseString];
    
  • копия из изменяемой строки

    NSString* foo = [mutableBar copy];  // foo needs to be released or autoreleased in this case
    
1 голос
/ 27 сентября 2010

Я предполагаю, что вы имеете в виду использование StringWithString или аналогичного вместо initWithString? StringWithString выделяет и вставляет для вас изнутри, а затем возвращает автоматически освобожденную строку.

Если вам не нужно выполнять какие-либо манипуляции со строками, кроме наличия строки, вы можете использовать NSString *str = @"string";

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

Если вам нужно вернуть строку, конечно же, вам нужно будет вернуть автоматически освобожденную строку. Я не думаю, что это сложнее, чем это.

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