Создает ли stringWithFormat экземпляр с сохранением +1? - PullRequest
0 голосов
/ 01 марта 2012

Я объявляю ивару типа NSString в классе.Чтобы инициализировать значение этого ивара, я использую следующий код:

NSString *myVar;

-(void)inAnyMethod
{
   myVar = [NSString stringWithFormat:@"%@",theValue];
}

Нужно ли выпускать этот ивар?Насколько я понимаю, это не моя ответственность.Но в большинстве случаев строки, которые я использую таким образом, вызывают утечки.

Чего мне не хватает?

Ответы [ 2 ]

5 голосов
/ 01 марта 2012

Вам не нужно release это, потому что это удобный метод, который возвращает объект autoreleased.

Чтобы узнать, получаете ли вы что-то со счетом хранения 1, которое вам нужно будет разблокировать, используйте Cocoa соглашения об именах, которые говорят, что все, что начинается с new, allocСодержит copy в имени метода, возвращает объект retain 1, остальные возвращают autoreleased объекты, как в этом случае.

0 голосов
/ 01 марта 2012

В дополнение к ответу Оскара Гомеса, обратите внимание, что когда вы используете методы класса (те методы со знаком плюс, которые вы можете найти в документации и не включены в список Оскар Гомес , например, stringWithFormat - этоодин из них), вам не нужно беспокоиться об управлении памятью.Если вы создаете свой собственный метод класса, вы должны сделать то же самое: вернуть объект автоматического выпуска.

Что касается вашего кода, он не сможет работать, если вы просто назначите свой ivar объекту NSString (возвращенному из этого метода),Фактически, в какой-то момент цикла вашего приложения объект будет освобожден (он был помещен в пул), и ваш ивар больше не будет ссылаться на какой-либо объект.

Хитрость: создайте @property сполитика copy или отправка сообщения copy, например:

myVar = [[NSString stringWithFormat:@"%@",theValue] copy];

Копирование обычно используется, когда класс имеет подклассы изменяемого типа.В противном случае используйте retain.Когда вы закончите, у вас есть имущество для этого объекта, и вы должны помнить, чтобы освободить его.Если вы этого не сделаете, вы вызовете утечку.

[myVar release];

PS Начиная с Xcode 4.2, появилась новая функция компилятора под названием ARC.

Надеюсь, это поможет.

...