Por convención en Cocoa y Cocoa-touch, cualquier objeto creado usando [[SomeClass alloc] initX]
o [SomeClass newX]
se crea con un conteo de retención de uno. Usted es responsable de llamar [someClassInstance release]
cuando haya terminado con su nueva instancia, por lo general en su método dealloc
.
Cuando esto se complica es cuando se asigna el nuevo objeto a una propiedad en lugar de una variable de instancia. La mayoría de las propiedades se definen como retain
o copy
, lo que significa que o bien incrementan retener el recuento del objeto cuando se establece, o hacer una copia del objeto, dejando el original intacto.
En su ejemplo, es probable que tenga esto en su archivo .h
:
@property (retain) MyObject *editMyObject;
Así que en su primer ejemplo:
// (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
Al crear su nueva instancia de MyObject
usando alloc
/init
, tiene un conteo de retención de uno. Cuando se asigna la nueva instancia de self.editMyObject
, en realidad estás llamando al método -setEditMyObject:
que el compilador crea para usted cuando @synthesize editMyObject
. Cuando el compilador ve self.editMyObject = x
, lo reemplaza por [self setEditMyObject: x]
.
En el segundo ejemplo:
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
se aferra a su nuevo objeto el tiempo suficiente para liberarlo, por lo que se equilibra la cuenta de retención (suponiendo que lo suelte en su método dealloc
).
Véase también Cocoa strategy for pointer/memory management
Tres buenas respuestas. Tenga en cuenta a quién dar la respuesta también. – 4thSpace