Разница между объявлением строки NSString с помощью alloc и init и назначением с помощью @ "myString" - PullRequest
1 голос
/ 26 января 2011

В настоящее время меня беспокоит небольшая проблема понимания Objective-C.В качестве примера, следующего за книгой Аарона Хиллегаса, я задаюсь вопросом о присвоении NSString в методе init класса значения, как в этом примере (Для людей, которые знают книгу, это используется в классе PersonRaiseMan):

- (id)init
{
   if(![super init])
     return nil;
   myString = @"New entry";
   return self;
}

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

НО!Что происходит в методе установки этой строки?Следуя правилам управления памятью, метод должен выглядеть следующим образом:

- (void)setMyString:(NSString *)newString
{
    if(myString != newString) {
        [myString release];
        [newString retain];
        myString = newString;
    }
}

Почему работает [myString release]?Я где-то читал, что с = @"bla" назначенные строки не могут быть освобождены.

И правильно ли инициализируется с = @"bla"?Или я должен использовать alloc и init вместо?

Спасибо за любую помощь:)

Ответы [ 3 ]

3 голосов
/ 26 января 2011

AFAIK, строковые константы вида @ "..." на самом деле являются дочерними классами NSString, которые переопределяют retain и сохраняются как no-ops. Это позволяет компилятору хранить эти строковые константы в сегменте данных вашего исполняемого файла, а не в куче.

3 голосов
/ 26 января 2011
NSString *constantString = @"constantString";

Строка типа constantString, как говорят, принадлежит к частному (?) Классу NSConstantString, и они живы всю жизнь вашей программы.Выпуск вне курса и сохранение работы (в том смысле, что они не дадут вам исключение или сбой). Они просто ничего не делают.

Подробнее здесь

Также вы сказали в одном из ваших комментариев, что это будет {@property(..., copy) NSString myString; Но то, что вы нам показываете, является типичным @property(..., retain)

0 голосов
/ 26 января 2011

Объявлен ли myString в заголовочном файле?Нравится: @property(nonatomic, retain) NSString myString.Если это так, то myString сохраняется.В противном случае его не нужно выпускать.

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