Zastąp ustawiacz łukiem

108
@interface Article : NSObject 

@property (nonatomic, strong) NSString *imageURLString;

@end


@implementation Class

@synthesize imageURLString = _imageURLString;

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

Czy poprawnie nadpisałem setter, gdy ARC jest włączone?

rowwingman
źródło
2
Tak, wydaje mi się to poprawne. Czy działa zgodnie z oczekiwaniami, czy nie?
Robin Summerhill,

Odpowiedzi:

89

Tak, to jest poprawne. Trochę też zajęło mi zaufanie, że to rzeczywiście słuszna decyzja.

Czy zdajesz sobie sprawę, że w tym przypadku nadpisanie nie jest konieczne, ponieważ nie robisz więcej niż zrobiłby to standard ustawiający? Tylko jeśli dodasz więcej kodu do setImageURLString:, będziesz musiał zastąpić ustawiający.

Pascal
źródło
6
Tak. Zdaję sobie z tego sprawę. Dodaję komentarz, w którym chcę dodać mój dodatkowy kod. Bardzo dziękuję za odpowiedź.
rowwingman
4
Wiesz, jaki byłby ciekawy eksperyment? Zmiana koloru komentarza (w SO i innych witrynach i IDE) ... zwykle jest to kolor jasnoszary lub coś, co się nie wyróżnia. # ff0000 może? Czy to coś zmieni? Jako programiści jesteśmy przyzwyczajeni do ignorowania komentarzy, chyba że konkretnie próbujemy wywnioskować, jak coś działa, w takim przypadku czasami je również ignorujemy.
maltalef
68

Rozszerzając odpowiedź udzieloną przez @Pascal, chciałbym tylko dodać, że jest to zdecydowanie słuszne rozwiązanie i możesz sprawdzić, do czego kompiluje się kod. Napisałem post na blogu o tym, jak przejść do sprawdzania, ale w zasadzie ten kod kompiluje się do (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}

Zwróć uwagę na wywołanie, _objc_storeStrongktóre zgodnie z LLVM robi to:

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

Więc odpowiadając na twoje pytanie, tak, zgadza się. ARC dodał w poprawnym wydaniu starej wartości i zachował nową wartość.

[Prawdopodobnie zbyt skomplikowana odpowiedź, ale pomyślałem, że warto było pokazać, jak możesz odpowiedzieć sobie na tego rodzaju pytania związane z ARC w przyszłości]

mattjgalloway
źródło
1
Dzięki za to, zgadywałem ponownie mój kod (i tę odpowiedź), ale rozwiałeś moje obawy.
evanflash
1
Dzięki Matt. Nie było dobrze być 43. wyborcą, ponieważ 42 wydawało się tak stosowną liczbą głosów na tę odpowiedź.
bmauter
1
A co, jeśli właściwość jest ustawiona do kopiowania? Na przykład @property (nonatomic, copy) UIColor * lineColor ;. W programie ustawiającym mogę po prostu zrobić _lineColor = input; czy muszę zrobić _lineColor = [kopia wejściowa] ;?
Daniel T.
1
@DanielT. musisz to zrobić _lineColor = [input copy];, tak.
mattjgalloway
-10

Połączenie

[super setImageURLString:theString];

Otóż ​​to

raulcatena
źródło
1
nadklasą nie może mieć implementację setImageURLString:
Wil Macaulay
Nawet gdyby tak było, prawdopodobnie zrobiłoby to, czego nie chcesz.
Nate Symer