호로 setter 재정의


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가 활성화되었을 때 setter를 올바르게 재정의 했습니까?


2
예, 이것은 나에게 맞는 것 같습니다. 예상대로 작동합니까?
Robin Summerhill 2011 년

답변:


89

네, 맞습니다. 또한 이것이 실제로 옳은 일이라는 것을 신뢰하는 데 시간이 걸렸습니다.

이 경우 표준 생성 setter가 수행하는 것보다 더 많은 작업을 수행하지 않으므로 재정의가 필요하지 않다는 것을 알고 있습니까? 더 많은 코드를 추가하는 경우에만 setImageURLString:setter를 재정의해야합니다.


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는 이전 값의 올바른 릴리스를 추가하고 새 값을 유지합니다.

[아마도 복잡한 답변은 아니지만, 앞으로 이런 ARC 관련 질문에 어떻게 답할 수 있는지 보여 주면 유용하다고 생각했습니다.]


1
감사합니다. 저는 제 코드 (그리고이 답변)를 추측하고 있었지만 제 두려움은 쉬었습니다.
evanflash

1
고마워 Matt. 42가이 답변에 적합한 투표 집계로 보였기 때문에 43 번째 투표자가 옳다고 생각하지 않았습니다.
bmauter 2013-07-02

1
속성이 복사되도록 설정되어 있으면 어떻게됩니까? 예를 들어 @property (비 원자, 복사) UIColor * lineColor ;. setter 내에서 _lineColor = input; 아니면 _lineColor = [input copy] ;?
Daniel T.

1
@DanielT. _lineColor = [input copy];네, 해야 합니다.
mattjgalloway

-10

요구

[super setImageURLString:theString];

그게 다야


1
슈퍼 클래스는 setImageURLString의 구현을 가질 가능성이되지 않습니다 :
윌 맥컬리

그렇게하더라도 원하지 않는 일을 할 것입니다.
Nate Symer 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.