Setter mit Lichtbogen überschreiben

108
@interface Article : NSObject 

@property (nonatomic, strong) NSString *imageURLString;

@end


@implementation Class

@synthesize imageURLString = _imageURLString;

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

Habe ich den Setter korrekt überschrieben, wenn ARC aktiviert ist?

Rowwingman
quelle
2
Ja, das sieht für mich richtig aus. Funktioniert es so, wie Sie es erwarten oder nicht?
Robin Summerhill

Antworten:

89

Ja das ist korrekt. Ich habe auch eine Weile gebraucht, um darauf zu vertrauen, dass dies tatsächlich das Richtige ist.

Sie wissen, dass in diesem Fall die Überschreibung nicht erforderlich ist, da Sie nicht mehr tun, als der standardmäßig generierte Setter tun würde? Nur wenn Sie mehr Code hinzufügen, müssen setImageURLString:Sie den Setter überschreiben.

Pascal
quelle
6
Ja. Das merke ich. Ich füge einen Kommentar hinzu, in dem ich meinen zusätzlichen Code hinzufügen möchte. Vielen Dank für die Antwort.
Ruderer
4
Sie wissen, was ein interessantes Experiment wäre? Ändern der Kommentarfarbe (in SO und anderen Websites und IDEs) ... normalerweise ist es hellgrau oder etwas, das nicht auffällt. # ff0000 vielleicht? Würde es einen Unterschied machen? Wir als Programmierer sind es gewohnt, Kommentare zu ignorieren, es sei denn, wir versuchen speziell abzuleiten, wie etwas funktioniert. In diesem Fall ignorieren wir sie manchmal auch.
Maltalef
68

Erweitern Sie die Antwort von @Pascal. Ich möchte nur hinzufügen, dass dies definitiv das Richtige ist und Sie überprüfen können, bis zu was der Code kompiliert wird. Ich habe einen Blog-Beitrag darüber geschrieben, wie man prüft, aber im Grunde wird dieser Code bis auf (ARMv7) kompiliert:

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

Beachten Sie den Aufruf, zu _objc_storeStrongdem laut LLVM dies geschieht:

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

Um Ihre Frage zu beantworten: Ja, das ist richtig. ARC hat in der korrekten Freigabe den alten Wert hinzugefügt und den neuen Wert beibehalten.

[Wahrscheinlich überkomplizierte Antwort, aber es war nützlich zu zeigen, wie Sie diese Art von ARC-bezogenen Fragen in Zukunft selbst beantworten können]

mattjgalloway
quelle
1
Vielen Dank dafür, ich habe meinen Code (und diese Antwort) hinterfragt, aber Sie haben meine Befürchtungen ausgeräumt.
Evansflash
1
Danke Matt. Es fühlte sich nicht richtig an, der 43. Wähler zu sein, weil 42 eine so passende Stimmenzahl für diese Antwort zu sein schien.
Bmauter
1
Was ist, wenn die Eigenschaft auf Kopieren eingestellt ist? Zum Beispiel @property (nichtatomar, kopieren) UIColor * lineColor;. Kann ich im Setter einfach _lineColor = input ausführen? oder muss ich _lineColor = [Eingabekopie] machen;?
Daniel T.
1
@ DanielT. du musst tun _lineColor = [input copy];, ja.
Mattjgalloway
-10

Anruf

[super setImageURLString:theString];

Das ist es

raulcatena
quelle
1
Die Superklasse wird wahrscheinlich keine Implementierung von setImageURLString haben:
Wil Macaulay
Selbst wenn es so wäre, würde es wahrscheinlich Dinge tun, die Sie nicht wollen.
Nate Symer