Основной вопрос, авто-релиз вопрос - PullRequest
1 голос
/ 19 января 2011

вопросы сохранения и автоматического выпуска.

// A
UIView *temp = [[UIView alloc] init];
myView = temp;
[temp release];

// B
myView = [[UIView alloc] init];

Разве два кода не имеют различий?

NSString *str = [NSString stringWithString:@"Hello"];
NSString *str = @"Hello";

И эти два?Я еще не уверен в сохранении счета.Спасибо.

Ответы [ 4 ]

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

Для первого примера они очень разные.В первом фрагменте кода UIView, заданный для temp, имеет счет сохранения 1 (спасибо alloc).Когда вы отпускаете его в третьей строке, переменная MyView теперь плохая, потому что объект может быть уничтожен.Если вы хотите, чтобы MyView сохранил его, выполните:

MyView = [temp retain];

Во второй части первого примера будет создан совершенно новый экземпляр UIView, который не имеет отношения к temp.

* 1007.* Во втором примере метод stringWithString будет autorelease вашей строкой, что означает, что она будет автоматически освобождена для вас, когда будет выпущен «пул релизов», гораздо позже.Вам не нужно беспокоиться о его выпуске.Однако во второй строке строка размещается статически.Подсчет количества и освобождение с ними совершенно не нужны.

Забыл упомянуть ... проверьте ответ на этот вопрос , чтобы узнать больше о правилах сохранения / освобождения.

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

Еще одна полезная вещь: вы можете NSLog сохранить остаток, чтобы вы могли проводить тестирование самостоятельно.

Но вернемся к вашему вопросу ...

ЕСЛИ MyView - это свойство, и вы ссылались на него с помощью self.MyView, и оно было объявлено с помощью retain или copy, ваши 2 утверждения совпадают. Если MyView - просто локальная переменная, ваш UIView будет освобожден, когда вы выполните

[temp release];

потому что вы ничего не сделали для увеличения количества сохраняемых файлов с момента его выделения.

Для вашего примера строки ...

[NSString stringWithString:@"Hello"];

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

Второй пример строки - это статически размещенная строка, и вам не нужно об этом беспокоиться. отсчет не распространяется на них.

0 голосов
/ 19 января 2011
  1. Помните, что ссылка MyView просто указывает на темп.Поэтому, как только вы отпускаете temp, это также влияет на MyView.

  2. [NSString stringWithString:] в основном используется для копирования других строк вместо обращения к адресу памяти.Например:

A:

NSString * string = someOtherString;// Копирует ссылку на someOtherString;

B:

NSString * string = [NSString stringWithString: someOtherString];// Делает копию другой строки.

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

Первая часть: это не то же самое!

Будет также выпущен MyView, потому что вы просто копируете указатель (оставьте счет 0).Во втором коде MyView будет иметь счет 1.


Вторая часть: это в основном то же самое.

...