Установка объекта на ноль после освобождения - TT_RELEASE_SAFELY - PullRequest
3 голосов
/ 12 мая 2011

Я начал изучать Three20, и у меня есть простой вопрос о TT_RELEASE_SAFELY До сих пор я люблю писать код таким образом:

UILabel *lab = [[UILabel alloc] initWithFrame:rect];
[self.view addSubview:lab];
[lab release];

Здесь я думаю, что основной пул отвечает за освобождение памяти lab.

Теперь я нашел TT_RELEASE_SAFELY, который определен так:

#define TT_RELEASE_SAFELY(__POINTER) { [__POINTER release]; __POINTER = nil; }

Как видите, после освобождения объект устанавливает nil.

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

Спасибо.

Ответы [ 3 ]

6 голосов
/ 12 мая 2011

Отправка сообщения на ноль действительна в Objective-C. Отправка сообщения освобожденному объекту не является.

Отправка сообщения на освобожденный объект:

id obj = [[MyClass alloc] init];
[obj release];
[obj doSomething]; // Crash!

Отправка сообщения на ноль:

id obj = [[MyClass alloc] init];
[obj release], obj = nil;
[obj doSomething]; // Valid
<ч />

Назначение nil переменной после освобождения объекта противоречиво, поскольку может помешать вам понять, что что-то не так. Пример Седаты Чужого:

[controlCenter dealloc];
...
float timeLeft = [controlCenter timeToWaitBeforeBombDetonation];

Этот код завершится сбоем после освобождения controlCenter. В результате этот дефект будет обнаружен и исправлен досрочно.

[controlCenter dealloc], controlCenter = nil;
...
float timeLeft = [controlCenter timeToWaitBeforeBombDetonation];

Этот код назначит 0.0 для timeLeft, который, по-видимому, является действительным временем ожидания, даже если controlCenter равен нулю.

<ч />

Примите вышеизложенное с небольшим количеством соли, поскольку, если вы пишете приложение Objective-C, вы, вероятно, больше заботитесь о том, чтобы ваши пользователи были довольны, избегая сбоев, чем разрушая города. Если последнее вызывает озабоченность, вам, вероятно, следует использовать язык, безопасный для типов, например Ada.

1 голос
/ 12 мая 2011

Я считаю, что использование этих вариантов «безопасных выпусков» является явно плохой идеей.

Ваше приложение не будет работать тихим и таинственным образом, поскольку сообщения, переданные на nil, не будут вызывать никаких предупреждений.Гораздо лучше не обнулять свои рекомендации и пользоваться всем, что может предложить NSZombieEnabled.

0 голосов
/ 12 мая 2011

Единственное отличие состоит в том, что TT_RELEASE_SAFELY устанавливает указатель на ноль после выпуска, поэтому ссылка не будет использоваться после выпуска. Шаблон хорош для подражания, а макрос TT_RELEASE_SAFELY упрощает его реализацию.

...