Перевизначення сетера з дугою


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?


2
Так, це мені здається правильним. Працює, як ви очікуєте чи ні?
Робін Саммерхілл

Відповіді:


89

Так, це правильно. Також мені знадобився певний час, щоб повірити, що це дійсно правильна річ.

Ви усвідомлюєте, що в цьому випадку переоцінка не потрібна, оскільки ви не робите більше, ніж це зробив стандартний створений сетер? Тільки якщо ви додасте більше коду setImageURLString:, вам потрібно буде замінити сетер.


6
Так. Я це усвідомлюю. Я додаю коментар там, де хочу додати свій додатковий код. Дуже дякую за відповідь.
rowwingman

4
Ви знаєте, що було б цікавим експериментом? Зміна кольору коментарів (у SO та інших сайтах та IDE) ... зазвичай це світло-сірий колір або щось, що не виділяється. # ff0000 можливо? Чи змінило б це? Ми, як програмісти, використовуємо для ігнорування коментарів, якщо спеціально не намагаємося вивести, як щось працює, і в такому випадку ми іноді їх ігноруємо.
maltalef

68

Розгортаючи відповідь, яку дав @Pascal, я просто хочу додати, що це, безумовно, правильно зробити, і ви можете перевірити, побачивши, до чого складається код. Я написав повідомлення в блозі про те, як рухатися до перевірки, але в основному цей код складається до (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}

Зверніть увагу на виклик, згідно з_objc_storeStrong яким відповідно до LLVM :

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

Отже, щоб відповісти на ваше запитання, так, це правильно. ARC додав у правильному звільненні старого значення та збереженні нового значення.

[Мабуть, над складною відповіддю, але я вважав, що це корисно показати, як можна в майбутньому відповісти на таке питання, пов'язане з АРК]


1
Дякую за це, я вдруге здогадався про свій код (і цю відповідь), але ви поклали страх на спокій.
evanflash

1
Дякую Метт. Не було правильним бути 43-м виборцем, тому що 42 видалися таким підходящим голосуванням за цю відповідь.
bmauter

1
Що робити, якщо властивість встановлено для копіювання? Наприклад @property (неатомічна, копія) UIColor * lineColor ;. Всередині сеттера я можу просто зробити _lineColor = введення; чи мені потрібно _lineColor = [копія вводу] ;?
Даніель Т.

1
@DanielT. ви повинні зробити _lineColor = [input copy];, так.
mattjgalloway

-10

Дзвінок

[super setImageURLString:theString];

Це воно


1
суперклас, ймовірно, не буде реалізовувати setImageURLString:
Wil Macaulay

Навіть якщо б це було, це, ймовірно, зробить речі, які ви не хочете, щоб вони це робили.
Нейт Симер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.