Я предполагаю, что в обоих ваших примерах строка, стоящая отдельно, является свойством и переменной экземпляра, как определено в интерфейсе класса.И что другой код выполняется из некоторого метода в том же классе.
Давайте посмотрим, что произойдет:
@property (nonatomic, retain) MyObject *myObject;
MyObject *obj = [[MyObject alloc] init]; // Retain count = 1
self.myObject = obj; // Retain count +1 (2), because property is defined
// as retain.
[obj release]; // Retain count -1
В этом примере все работает как надо.Давайте посмотрим на второй:
MyObject *myObject;
MyObject *obj = [[MyObject alloc] init]; // Retain count = 1
myObject = obj; // Retain count still 1. Assigns never changes
// retain counts.
[obj release]; // Retain count -1 (0), object is now deallocated.
// Any access to it though obj or myObject WILL
// cause a crash.
Вы можете на самом деле кодировать Objective-C и считать его почти на 100% собранным мусором, вам просто нужно доверять пулам автоматического выпуска.Всякий раз, когда вы выделяете объект, вы также должны немедленно передать его в пул автоматического выпуска.Таким образом, вам нужно беспокоиться только о том, чтобы сохранить то, что вы хотите выжить после окончания текущего метода.
Ваш первый пример может быть:
@property (nonatomic, retain) MyObject *myObject;
MyObject *obj = [[[MyObject alloc] init] autorelease];
self.myObject = obj; // Implicitly retain through property
А ваш второй будет:
MyObject *myObject;
MyObject *obj = [[[MyObject alloc] init] autorelease];
myObject = [obj retain]; // Explicitly retained to survive end of method
Как видите, простое добавление autorelease
при выделении новых объектов и последовательное использование свойств уменьшит управление памятью до простого освобождения переменных экземпляра в методе dealloc
.