Ayarlayıcıyı yay ile geçersiz kılma


108
@interface Article : NSObject 

@property (nonatomic, strong) NSString *imageURLString;

@end


@implementation Class

@synthesize imageURLString = _imageURLString;

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

ARC etkinleştirildiğinde ayarlayıcıyı doğru bir şekilde devre dışı bıraktım mı?


2
Evet, bu bana doğru görünüyor. Beklediğiniz gibi çalışıyor mu, çalışmıyor mu?
Robin Summerhill

Yanıtlar:


89

Evet bu doğru. Ayrıca bunun gerçekten yapılacak doğru şey olduğuna inanmam biraz zaman aldı.

Bu durumda, standart olarak oluşturulan ayarlayıcının yapacağından daha fazlasını yapmadığınız için geçersiz kılmanın gerekli olmadığının farkında mısınız? Yalnızca daha fazla kod eklerseniz setImageURLString:, ayarlayıcıyı geçersiz kılmanız gerekir.


6
Evet. Bunu anlıyorum. Ek kodumu eklemek istediğim yere yorum ekliyorum. Cevabınız için çok teşekkür ederim.
rowwingman

4
İlginç bir deney ne olurdu biliyor musun? Yorum rengini değiştirmek (SO'da ve diğer sitelerde ve IDE'lerde) ... genellikle açık gri veya göze çarpmayan bir şeydir. # ff0000 belki? Bir fark yaratır mı? Programcılar olarak, özellikle bir şeyin nasıl çalıştığını anlamaya çalışmadığımız sürece yorumları yok saymaya alışkınız, bu durumda bazen onları da görmezden geliyoruz.
maltalef

68

@Pascal tarafından verilen yanıtı genişleterek, bunun kesinlikle yapılması gereken doğru şey olduğunu ve kodun neye göre derlendiğini görerek kontrol edebileceğinizi eklemek istiyorum. Nasıl kontrol edileceğiyle ilgili bir blog yazısı yazdım , ancak temelde bu kod (ARMv7) 'ye derlenir:

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

Çağrısına Not _objc_storeStronghangi LLVM göre yapar:

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

Yani, sorunuzu cevaplamak için, evet bu doğru. ARC, eski değerin doğru sürümüne ekledi ve yeni değeri korudu.

[Muhtemelen karmaşık cevaplardan fazladır, ancak gelecekte ARC ile ilgili bu tür soruları kendiniz için nasıl cevaplayabileceğinizi göstermenin yararlı olacağını düşündüm]


1
Bunun için teşekkürler, kodumu (ve bu cevabı) ikinci tahmin ediyordum ama korkularımı dinlendirdin.
evanflash

1
Teşekkürler Matt. 43. seçmen olmak doğru gelmedi, çünkü 42 bu cevap için çok uygun bir oy sayısı gibi görünüyordu.
bmauter

1
Ya özellik kopyalanacak şekilde ayarlanmışsa? Örneğin @property (nonatomic, copy) UIColor * lineColor ;. Ayarlayıcının içinde sadece _lineColor = input; yoksa _lineColor = [input copy]; yapmak zorunda mıyım?
Daniel T.

1
@DanielT. yapmak zorundasın _lineColor = [input copy];, evet.
mattjgalloway

-10

Aramak

[super setImageURLString:theString];

Bu kadar


1
üst sınıfın setImageURLString uygulamasına sahip olması muhtemel değildir:
Wil Macaulay

Olsa bile, muhtemelen yapmasını istemediğiniz şeyleri yapardı.
Nate Symer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.