¿Cómo puedo usar un setter personalizado para la siguiente propiedad después de haberlo sintetizado?Organizador personalizado para @property?
@property (nonatomic,retain) UIButton *but
¿Cómo puedo usar un setter personalizado para la siguiente propiedad después de haberlo sintetizado?Organizador personalizado para @property?
@property (nonatomic,retain) UIButton *but
@property (getter=yourGetter,setter=yourSetter:) UIButton *but;
Implementar
- (void)setBut:(UIButton *)aButton;
Se debe probablemente algo como
- (void)setBut:(UIButton *)aButton {
[but release];
but = [aButton retain];
// whatever
}
@Sascha es casi justo pero su código tiene un pequeño insecto en ella;)
Se vería como cualquiera :
A)
-(void)setBut:(UIButton *)value {
if (but != value) {
[but release];
but = [value retain];
}
}
o B)
-(void)setBut:(UIButton *)value {
[but autorelease];
but = [value retain];
}
(A) es (muy) ligeramente más eficiente, (B) es más legible.
¿Por qué necesitamos la sentencia if en la opción (A) en lugar de sólo la liberación & retener en la respuesta de @ Sascha?
¿Qué sucede si pasa dos veces en el mismo objeto?
decir
// We set our button for the first time
UIButton *test = [UIButton alloc] init];
[self setBut:test];
[test release];
// Much later in the code, we set the button again
[self setBut:test];
Si no buscamos que but
no era un objeto diferente, lo primero que haríamos en nuestra colocador es release
ella. Intentamos entonces retain
un objeto que ya no existe, lo que provoca un bloqueo.
NB No necesitamos la instrucción if en la opción (B) porque la liberación automática no liberará el botón inmediatamente, así que tenemos tiempo para retenerlo sin que se destrabe.
A B +) alternativa a deanWombourne soluciones:
-(void)setBut:(UIButton *)value {
[value retain]
[but release];
but = value;
}
Esta solución evitará problemas donde valor es un sub-objeto de pero.
Un A +) alternativa a deanWombourne soluciones:
-(void)setBut:(UIButton *)value {
if (but != value) {
[value retain]
//insert here but's cancel, invalidate, delegate = nil, ...
[but release];
but = value;
}
}
Esta solución evitará problemas donde valor es un sub-objeto de pero. Y le permitirá agregar un cancel
para un NSURLConnection, un invalidate
un NSTimer o NSPort, un cero para un delegado, ...
Creo que esto es como los emisores de @synthesised lo hacen, y funciona en todas las situaciones, independientemente de si se asigna el mismo objeto o no:
- (void)setBut: (UIButton*)aButton
{
id oldObject = but;
but = [aButton retain];
[oldObject release];
}
no puede ir mal, por lo que puede ver.
También tenga en cuenta que, como señaló Sascha, si proporciona un configurador personalizado, se espera que suelte/conserve las referencias usted mismo. – devios1
Tenga en cuenta que getter y setter personalizados son como SELECTOR normal, por lo que yourSetter: debe tener dos puntos – onmyway133