По соглашению в Какао и касании Какао любой объект, созданный с использованием [[SomeClass alloc] initX]
или [SomeClass newX]
, создается с счетом сохранения один. Вы несете ответственность за вызов [someClassInstance release]
, когда закончите работу с новым экземпляром, как правило, с помощью метода dealloc
.
Ситуация становится сложной, когда вы назначаете новый объект свойству вместо переменной экземпляра. Большинство свойств определены как retain
или copy
, что означает, что они либо увеличивают счетчик сохранения объекта при его установке, либо создают копию объекта, оставляя оригинал нетронутым.
В вашем примере это, вероятно, есть в вашем файле .h
:
@property (retain) MyObject *editMyObject;
Итак, в вашем первом примере:
// (2) property setter increments retain count to 2
self.editMyObject =
// (1) new object created with retain count of 1
[[MyObject alloc] init];
// oops! retain count is now 2
Когда вы создаете свой новый экземпляр MyObject
, используя alloc
/ init
, он имеет счет сохранения один. Когда вы назначаете новый экземпляр для self.editMyObject
, вы фактически вызываете метод -setEditMyObject:
, который компилятор создает для вас, когда вы @synthesize editMyObject
. Когда компилятор видит self.editMyObject = x
, он заменяет его на [self setEditMyObject: x]
.
Во втором примере:
MyObject *temp = [[MyObject alloc] init];
// (1) new object created with retain count of 1
self.editMyObject = temp;
// (2) equivalent to [self setEditMyObject: temp];
// increments retain count to 2
[temp release];
// (3) decrements retain count to 1
вы держите новый объект достаточно долго, чтобы освободить его, поэтому счет удержания сбалансирован (при условии, что вы высвобождаете его в методе dealloc
).
См. Также Стратегия какао для управления указателем / памятью