2012-04-22 5 views
2

내가 읽고있다 수행 방법 : http://cocoacast.com/?q=node/103읽기 전용 속성 작업

내가 위의 페이지에서이 방법을 건너 온 :

-(void)foo 
    { 
    self->iVar = 5; //legal because we are referencing a member variable 
iVar = r; // illegal because we are referencing a readonly property 
    }  

은 그때 엑스 코드에서 프로젝트를 생성합니다.

Test0.h

#import <Foundation/Foundation.h> 

@interface Test0 : NSObject 
{ 
@private int iVar; 
} 
@property (readonly, assign) int iVar; 
- (void) foo; 
@end 

Test0.m

#import "Test0.h" 

@implementation Test0 
@synthesize iVar; 

- (void) foo 
{ 
iVar = 5; 
} 
    @end  

main.m 콘솔의 결과는 5

내 질문입니다

#import <Foundation/Foundation.h> 
    #import "Test0.h" 
    int main(int argc, const char * argv[]) 
    { 

    @autoreleasepool { 
    Test0 *t1 = [[Test0 alloc] init]; 
    [t1 foo]; 
    NSLog(@"%d", t1.iVar); 
    } 
    return 0; 
    } 

:

  1. 위에서 언급 한 웹 페이지가 는 자기> 바르 = 5 내가 바르 사용한 은 = 5

는 어떤 차이가 않습니다 사용?

  1. 위에서 언급 한 웹 페이지에는 iVar = r; // 읽기 전용 속성을 참조하기 때문에 불법입니다

iVar = 5 (iVar = 5)는 iVar = r과 같지 않습니까? 어떻게 불법이 아닌가?

+3

그 기사가 잘못되었습니다. 'self-> iVar = 5'와'iVar = 5'는 완전히 동일합니다. 'self.iVar = 5'는 불법입니다. – ughoavgfhw

답변

4

읽기 전용 속성은 어떻게 작동합니까?

컴파일러는 단순히 setter의 존재를 생성하거나 확인하지 않습니다. getter가 생성되고 해당 속성은 ivar로 백업 될 수 있습니다. 또한 setter는 클래스 인터페이스에서 선언되지 않습니다.

iVar = r;

는 어떤 차이가 않습니다

self->iVar = r;

?

없음. 그들은 동일합니다. 그들은 둘 다 직접 ivar의 임무입니다. 불필요한 범위 분석 (예 : this->)을 추가 할 때 다른 언어와 유사합니다.

차이점은 설정자 (예 : self.prop = val 또는 [self setProp:val];)을 사용하려고 할 때입니다. 이 경우 컴파일러는 경고 메시지를 표시하고 런타임에서 예외를 throw합니다 (사용자 또는 하위 클래스가 직접 setter를 정의하지 않은 경우).

위에서 언급 한 웹 페이지가 잘못 iVar = r; // illegal because we are referencing a readonly property.

는 말한다. ivar이 존재하면 readonly 속성의 ivar에 직접 액세스 할 수 있습니다. . setter를 사용하는 대신 ivar에 직접 액세스하기 때문에 오류가 표시되지 않습니다.


다른 문제 :

  • 기사가 잘못 아토을 말한다 '는 mutexed'된다.
  • 이 문서에서는 원자 속성이 스레드 안전을 보장하지 못한다고 잘못 설명합니다.
+0

저스틴, 당신의 대답은 맞습니다.하지만 조금 더 많은 정보가 포함되어 있다고 생각합니다. 개선 될 수 있습니다. –

+1

@ItaiFerber가 작업 중 ... 링크 된 게시물을 실제로 검토합니다. – justin

+0

걱정할 필요가 없습니다. 그런 식으로 남겨 두지 않으려 고하고 싶었습니다. 나로부터 upvote. ;) –