Per convenzione in Cocoa e Cocoa-touch, qualsiasi oggetto creato utilizzando [[SomeClass alloc] initX]
o [SomeClass newX]
viene creato con un conteggio resti di uno. Sei responsabile di chiamare [someClassInstance release]
quando hai finito con la nuova istanza, in genere nel tuo metodo dealloc
.
Quando ciò risulta complicato è quando si assegna il nuovo oggetto a una proprietà anziché a una variabile di istanza. La maggior parte delle proprietà è definita come retain
o copy
, il che significa che incrementano il conteggio di conservazione dell'oggetto quando vengono impostate, o creano una copia dell'oggetto, lasciando intatto l'originale.
Nel tuo esempio, probabilmente avete nel vostro file .h
:
@property (retain) MyObject *editMyObject;
Quindi nel tuo primo esempio:
// (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
Quando si crea la nuova istanza di MyObject
usando alloc
/init
, ha un conto di mantenimento di uno. Quando assegni la nuova istanza a self.editMyObject
, stai effettivamente chiamando il metodo -setEditMyObject:
che il compilatore crea per te quando fai il @synthesize editMyObject
. Quando il compilatore vede self.editMyObject = x
, lo sostituisce con [self setEditMyObject: x]
.
Nel secondo esempio:
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
si tiene a tuo nuovo oggetto abbastanza a lungo per liberarlo, in modo che il conteggio di conservare è equilibrato (supponendo che si rilascia nel metodo dealloc
).
Vedi anche Cocoa strategy for pointer/memory management
fonte
2009-03-05 00:37:27
Tre buone risposte. Nota bene chi dare la risposta anche. – 4thSpace