2011-07-27 22 views

Respuesta

22
@property (getter=yourGetter,setter=yourSetter:) UIButton *but; 
+0

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

+0

Tenga en cuenta que getter y setter personalizados son como SELECTOR normal, por lo que yourSetter: debe tener dos puntos – onmyway133

0

Implementar

- (void)setBut:(UIButton *)aButton; 

Se debe probablemente algo como

- (void)setBut:(UIButton *)aButton { 
    [but release]; 
    but = [aButton retain]; 
    // whatever 
} 
23

@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.

1

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, ...

0

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.