По соглашению в какао и какао-прикосновении любой объект, созданный с использованием [[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
).
Смотрите также Cocoa strategy for pointer/memory management
Три хорошие ответы. Заметьте, кто и кто ответит. – 4thSpace