2011-05-16 11 views
2

수업이 있다고 가정 해 보겠습니다. 나는 다음과 같은 방법으로 속성을 선언하고 싶습니다 : 그것은 읽기 전용해야 프로그램 액세스 할 경우 클래스의 외부에서읽기 전용 콘센트입니까?

  1. ;
  2. 콘센트를 사용하여 을 Interface Builder에서 설정할 수 있어야합니다.
  3. (클래스 내부에서 쓰기 가능해야하지만 어떻게해야하는지 알 수 있습니다.)

은 "솔루션"나는 한 번 세터 작성하는 것입니다 내놓았다 :

- (void) setA: (ClassA *)a { 
    if (aHaveBeenSet) 
     return; 
    else { 
     // do what a setter have to do 
     aHaveBeenSet == YES; 
    } 
} 

을하지만, 그래서 여전히 (한 번만 효과 아니지만) 코드에서 호출 할 수있는이 세터 상당히 해결책은 아닙니다.

또 다른 방법은 함께 IBOutlet으로 바르를 표시하고이 같은 재산 readonly을하는 것입니다 :

@interface MyClass : NSObject { 
    IBOutlet ClassA *a; 
} 
@property (readonly) ClassA *a; 
@end 

그러나 this answer에 따르면,이 빈약 한 스타일의 메모리 관리가 불분명합니다.

아이디어가 있으십니까?

답변

3

내가 틀렸다면 누군가가 나를 수정하지만 NIB 로딩 메커니즘은 런타임에 .nib 파일을 인스턴스화 할 때만 setter 메서드를 확인합니다. 클래스 확장에

// MyClass.h 
@property (readonly, retain) IBOutlet ClassA *a; 
추가 정보를 위해
// MyClass.m 
@interface MyClass() 
@property (readwrite, retain) ClassA *a; 
@end 

@implementation MyClass 
@synthesize a; 
... 
@end 
+0

가 [목적-C 프로그래밍 언어를 참조하십시오 그래서 당신이 같은 읽기 전용 공용 속성을 선언하지만하는 .m 파일에 "개인"세터를 작성할 수 의미 ] (http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocCategories.html%23//apple_ref/doc/uid/TP30001163-CH20-SW2). – ughoavgfhw

+0

이것은 찌르기 로딩 코드가'if ([obj respondsToSelector : @selector (setA :)]) [obj setA : a]'와 같은 것을 할 것이라는 의미입니까? 그렇다면 setter가 공개적으로 선언되지는 않았지만 조건이 '예'로 평가됩니까? – adubr

+0

첫 번째 질문 : 확실하지는 않지만 나는 그렇다고 생각합니다. 두 번째 질문 : 분명히 그렇습니다. –