2012-07-10 4 views
2

나는 몇몇 자습서를 따르고 있으며 다른 클래스 인 클래스에서 인스턴스 변수로 @property에 대해 의문을 가지고 있습니다.@property Objective-C

@interface Rectangle : NSObject{ 
    int width; 
    int height; 
    XYpoint *origin; 
} 

@property int width, height; 

내가 다른 파일 내 된 Xypoint 클래스가, 모든 것이 잘 작동하지만 튜토리얼에서 나는 다음과 같은되어, 메인 프로그램에서, 그는 AA "사각형 * 연구"를 생성하고, 원점 변수로 도트 구문을 사용합니다 다만이 같은 :

r.origin = ****;

I`been는 @property에 개체 변수를 추가하는 방법을 검색하지만 난 아무것도 발견하지 않았습니다, 그리고 난 그래서 만약, 여러 가지 방법으로하지만 성공을 추가하기 위해 노력하고 누군가가 이걸로 나를 도울 수 ...

내가 다른 추가하는 등의 작업을 시도하는 것은 : 당신은 이미 인스턴스 변수 XYpoint *origin

+0

'@property XYPoint * origin'은 정확하지만'@synthesize origin'에 별표가 필요하지 않습니다. – wquist

+0

@synthesize 원본에서; unsafe_unretained 속성 'origin'에 대한 기존 ivar 'origin'이 __unsafe_unretained 여야합니다. – Pedro

+0

이 '@property (strong)'처럼 선언해야하며,이 '@property (nonatomic, strong)'을 권장합니다. 내 대답에 철저히 준 문서를 읽으십시오 !! – borrrden

답변

2

별표, 그리고 여러 가지 다른 방법이없는도

"@property XYpoint *origin" and "@synthesize *origin" 

..., 그래서 당신이 원하는 것은 속성을 만드는 것입니다 그 인스턴스 변수에 의해 뒷받침되고 그것을 합성합니다. 나는 보통 ivar에 밑줄 접두사를 사용하여 혼란스러운 쉐도 잉 경고로 끝나거나 실수로 잘못된 경고문을 참조하지 않도록합니다.하지만 그건 당신에게 달려 있습니다. 이런 식으로 뭔가 : 이제

@interface Rectangle : NSObject { 
    XYpoint *_origin; 
} 

@property (nonatomic, strong) XYpoint *origin; 

@end 

@implementation 

@synthesize origin = _origin; 

// rest of your class 

@end 

클래스를 사용하는 경우, 당신은 도트 구문 사용하여 속성을 참조 할 수 있어야한다 :

Rectangle *rect = [[Rectangle alloc] init]; 
XYpoint *pointFromRect = rect.origin; 
1

속성 목표 - C의 이러한 근본적인 기본적인 부분을 당신 다른 것을하기 전에 그들을 마스터해야합니다. 속성에 *이 필요한지 여부는 어떤 종류의 변수인지에 따라 다릅니다. 스택 변수 (struct, int, float 등)이면 일반적으로 필요하지 않습니다. 그것이 힙 오브젝트 (모든 클래스)이면 필요합니다. 그러나 합성에 *이 필요하지 않습니다. 또한 명시 적으로 iVar를 선언 할 필요가 없으며 컴파일러에서 자동으로 iVar를 생성합니다. 이것은 잠시 동안 지금의 경우입니다. 당신이 다른 클래스에 객체/변수에 액세스 할 수 있도록 @property와 @synthesize를 사용>The Objective-C Programming Language : Declared Properties

+0

자동 ivars에 관해서는, 나는 디버거에서 내 ivars를 볼 수 있기를 좋아합니다. 그래서 자주 수동으로 선언합니다. 최근에는 검사하지 않았지만 자동으로 생성 될 때 이전에 디버거에서 볼 수 없었습니다. – Stew

+1

@Stew 만약 그들이 보이지 않는다면, 나는 단지 디버거 명령 (po foo, etc.)을 사용하여 그것들을 진짜 빨리 출력 할 것입니다. 그러나, 그들은 보통 (나는 진짜로 빨리 점검했고, 나는 '자기'아래에 나의 재산을 볼 수 있었다) – borrrden

0

, 자동으로 getter 및 setter를 생성 -

이 읽기. wquist가 언급했듯이 @synthesize는 아스테릭스가 필요하지 않습니다. 너는 너비와 높이를위한 속성을 만들었다. 그들은 같은 목적을 가지고 있으며, 다른 클래스에 액세스합니다.