Распределение и инициализация NSString

В чем разница между:

NSString *string1 = @"This is string 1.";

и

NSString *string2 = [[NSString alloc]initWithString:@"This is string 2.];

Почему я не выделяю и не инициализирую первую строку, но она все еще работает? Я думал, что я должен выделить NSString, поскольку это объект?

В Cocoa Нажмите,

-(IBAction) clicked: (id)sender{
   NSString *titleOfButton = [sender titleForState:UIControlStateNormal];
   NSString *newLabelText = [[NSString alloc]initWithFormat:@"%@", titleOfButton];
   labelsText.text=newLabelText;
   [newLabelText release];
}

Почему я не выделяю и не инициализирую строку titleOfButton? Использует ли метод, который я называю, для меня?

Кроме того, я использую XCode 4, но мне не нравится iOS 5, и поэтому, поэтому я не использую ARC, если это имеет значение. Пожалуйста, не говорите, что я должен, я здесь, чтобы узнать, почему это так. Спасибо!

Ответ 1

Переменная string1 является NSString строковым литералом. Компилятор выделяет для него пространство в исполняемом файле. Он загружается в память и инициализируется при запуске вашей программы. Он работает до тех пор, пока приложение работает. Вам не нужно retain или release его.

Продолжительность жизни переменной string2 до тех пор, пока вы укажете, до момента, когда вы release указали ее последнюю ссылку. Вы выделяете для этого место, поэтому вы несете ответственность за очистку после него.

Продолжительность жизни переменной titleOfButton - это срок службы метода -clicked:. Это потому, что метод -titleForState: возвращает autorelease -d NSString. Эта строка будет выпущена автоматически, как только вы покинете область действия метода.

Вам не нужно создавать newLabelText. Этот шаг является излишним и беспорядочным. Просто установите для свойства labelsText.text значение titleOfButton:

labelsText.text = titleOfButton;

Зачем использовать свойства? Поскольку установка этого свойства retain увеличит счетчик ссылок titleOfButton на один (то почему он назвал свойство retain), и поэтому строка, на которую указывает titleOfButton, будет находиться в конце -clicked: > .

Еще один способ подумать об использовании retain в этом примере состоит в том, что labelsText.text является "владельцем" строки, на которую указывает titleOfButton. Эта строка будет продолжаться до тех пор, пока labelsText живет (если какая-либо другая переменная также не принадлежит владельцу строки).