Sobrescribir correctamente el configurador en Objective-C

Acabo de intentar anular los sintetizadores estándar sintetizados de una propiedad. Hasta el momento todo está bien. Simplemente instalé el ivar en mi nuevo valor. Pero luego me pregunté 'qué pasa con el conteo de retención de properties retenidas' … No encontré una buena respuesta que me explicara esto. Entonces lo pido aquí. ¿Hay algo de lo que tenga que tener en count si anulo un configurador de properties que está configurado para retain y cómo puedo hacerlo correctamente? Yo no uso ARC.

He aquí un ejemplo:

 @property(nonatomic)NSInteger number; - (void)setNumber:(NSInteger)number { _number = number; // This should be fine, since it's no retained object I want to set } @property(nonatomic, retain)NSObject *something; - (void)setSomething:(NSObject *)something { _something = something; // This is not fine. As far as I know you should never do sth. like this... But how do I set it correctly? } 

 -(void) setAnObject:(NSObject*) someObject { if (_anObject != someObject) { NSObject* savedObject = _anObject; _anObject = [someObject retain]; [savedObject release]; } } 

Si suelta el puntero anterior antes de retener el nuevo, puede tener una situación en la que está estableciendo el valor de un valor en el object anterior, y la liberación del object anterior hace que el nuevo object salga POOF. justo antes de que se retenga.

Como alternativa, podrías hacer

 .... [someObject retain]; [_anObject release]; _anObject = someObject; ... 

Editado después de estudiar la respuesta aceptada de Hot Licks

statement de properties y síntesis de x

 @property (nonatomic, retain) ClassX x; @synthesize x = _x; 

set excesivamente montado para x

 - (void)setX:(ClassX *)x; { if (x != _x) { [x retain]; [_x release]; _x = x; // custom code here } } 

¿Estás sobrescribiendo a los creadores solo para tener un nombre diferente? Si ese es el caso, puede hacerlo cambiando la definición de propiedad:

 @property(nonatomic, setter = nameOfSetter: )NSInteger number; 

Mismo funciona para getter.

 - (void) setSomething:(NSObject*) something { if (something != _something) { [_something release]; _something = [something retain]; } } 

Necesita la instrucción if porque, de lo contrario, si algo y _algo ya fueran iguales, sobreescribirá el object, posiblemente desaparezca y tenga problemas.