Ignora setter con arco


108
@interface Article : NSObject 

@property (nonatomic, strong) NSString *imageURLString;

@end


@implementation Class

@synthesize imageURLString = _imageURLString;

- (void)setImageURLString:(NSString *)imageURLString {
    _imageURLString = imageURLString;
    //do something else
}

Ho ignorato correttamente il setter quando ARC è abilitato?


2
Sì, mi sembra corretto. Funziona come ti aspetti o no?
Robin Summerhill

Risposte:


89

Sì, è corretto. Inoltre mi ci è voluto un po 'per credere che questa sia davvero la cosa giusta da fare.

Ti rendi conto che in questo caso l'override non è necessario in quanto non fai più di quanto farebbe il setter generato dallo standard? Solo se aggiungi più codice a setImageURLString:avresti bisogno di sovrascrivere il setter.


6
Sì. Me ne rendo conto. Aggiungo un commento dove voglio aggiungere il mio codice aggiuntivo. Grazie mille per la risposta.
Rowwingman

4
Sai quale sarebbe un esperimento interessante? Cambiare il colore del commento (in SO e altri siti e IDE) ... di solito è grigio chiaro o qualcosa che non spicca. # ff0000 forse? Farebbe differenza? Noi programmatori siamo abituati a ignorare i commenti a meno che non stiamo specificatamente cercando di dedurre come funziona qualcosa, nel qual caso a volte li ignoriamo anche.
maltalef

68

Espandendo la risposta data da @Pascal, vorrei solo aggiungere che è sicuramente la cosa giusta da fare e puoi controllare vedendo a cosa si compila il codice. Ho scritto un post sul blog su come procedere al controllo, ma fondamentalmente quel codice si compila fino a (ARMv7):

        .align  2
        .code   16
        .thumb_func     "-[Article setImageURLString:]"
"-[Article setImageURLString:]":
        push    {r7, lr}
        movw    r1, :lower16:(_OBJC_IVAR_$_Article._imageURLString-(LPC7_0+4))
        mov     r7, sp
        movt    r1, :upper16:(_OBJC_IVAR_$_Article._imageURLString-(LPC7_0+4))
LPC7_0:
        add     r1, pc
        ldr     r1, [r1]
        add     r0, r1
        mov     r1, r2
        blx     _objc_storeStrong
        pop     {r7, pc}

Nota la chiamata a _objc_storeStrongcui secondo LLVM fa questo:

id objc_storeStrong(id *object, id value) {
    value = [value retain];
    id oldValue = *object;
    *object = value;
    [oldValue release];
    return value;
}

Quindi, per rispondere alla tua domanda, sì, è vero. ARC ha aggiunto nel corretto rilascio del vecchio valore e mantenere il nuovo valore.

[Probabilmente una risposta troppo complicata, ma ho pensato che fosse utile mostrare come puoi rispondere a questo tipo di domanda relativa ad ARC per te stesso in futuro]


1
Grazie per questo, stavo cercando di indovinare il mio codice (e questa risposta) ma hai messo a tacere le mie paure.
evanflash

1
Grazie Matt. Non mi sembrava giusto essere il 43esimo elettore, perché 42 sembrava un conteggio dei voti così appropriato per questa risposta.
bmauter

1
E se la proprietà è impostata per la copia? Ad esempio @property (nonatomic, copy) UIColor * lineColor ;. All'interno del setter, posso semplicemente fare _lineColor = input; o devo fare _lineColor = [input copy] ;?
Daniel T.

1
@DanielT. devi fare _lineColor = [input copy];, sì.
mattjgalloway

-10

Chiamata

[super setImageURLString:theString];

Questo è tutto


1
è improbabile che la superclasse abbia un'implementazione di setImageURLString:
Wil Macaulay

Anche se lo facesse, probabilmente farebbe cose che non vuoi che faccia.
Nate Symer
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.