Substituir setter com 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
}

Eu cancelei corretamente o configurador quando o ARC está ativado?

remador
fonte
2
Sim, isso parece correto para mim. Está funcionando como você espera ou não?
Robin Summerhill

Respostas:

89

Sim isto está correcto. Também demorei um pouco para acreditar que essa é realmente a coisa certa a fazer.

Você percebe que, neste caso, a substituição não é necessária, pois você não faz mais do que o configurador gerado pelo padrão faria? Somente se você adicionar mais código a setImageURLString:, será necessário substituir o configurador.

Pascal
fonte
6
Sim. Eu percebo isso. Eu adiciono um comentário onde desejo adicionar meu código adicional. Muito obrigado pela resposta.
rowwingman
4
Você sabe o que seria uma experiência interessante? Alterar a cor do comentário (no SO e em outros sites e IDEs) ... geralmente é cinza claro ou algo que não se destaca. # ff0000 talvez? Isso faria diferença? Nós, como programadores, estamos acostumados a ignorar comentários, a menos que estejamos especificamente tentando deduzir como algo funciona; nesse caso, às vezes também os ignoramos.
maltalef
68

Expandindo a resposta dada por @Pascal, gostaria apenas de acrescentar que é definitivamente a coisa certa a se fazer e você pode verificar o que o código compila. Eu escrevi uma postagem no blog sobre como fazer a verificação, mas basicamente esse código é compilado para (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}

Observe a chamada _objc_storeStrongque, de acordo com o LLVM, faz isso:

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

Então, para responder à sua pergunta, sim, está certo. A ARC adicionou na liberação correta do valor antigo e na retenção do novo valor.

[Provavelmente devido a uma resposta complicada, mas pensei que seria útil mostrar como você pode responder a esse tipo de pergunta relacionada ao ARC no futuro]

mattjgalloway
fonte
1
Obrigado por isso, eu estava questionando meu código (e esta resposta), mas você colocou meus temores de lado.
evanflash
1
Obrigado Matt. Não parecia certo ser o 43º eleitor, porque 42 parecia uma contagem de votos adequada para esta resposta.
bmauter
1
E se a propriedade estiver configurada para copiar? Por exemplo @property (nonatomic, copy) UIColor * lineColor ;. Dentro do setter, posso apenas fazer _lineColor = input; ou eu tenho que fazer _lineColor = [cópia de entrada] ;?
Daniel T.
1
@DanielT. você tem que fazer _lineColor = [input copy];, sim.
mattjgalloway
-10

Ligar

[super setImageURLString:theString];

É isso aí

Raulcatena
fonte
1
a superclasse provavelmente não terá uma implementação de setImageURLString:
Wil Macaulay
Mesmo se fizesse, provavelmente faria coisas que você não quer fazer.
Nate Symer