2012-07-19 8 views
11

해당 범주에서 클래스의 개인 속성에 액세스하려고합니다.Objective-C에서 범주에서 개인 속성에 액세스하는 방법

하지만 개인 속성에 액세스하려면 카테고리에 같은 개인 속성을 다시 선언해야합니다.
다시 선언하지 않으면 컴파일 오류 (Property '<property name>' not found on object of type '<class name> *')가 표시됩니다.

카테고리에서 클래스의 비공개 속성에 액세스하는 올바른 방법입니까?
그리고 더 좋은 방법이 있습니까?

ClassA.h

@interface ClassA : NSObject 
-(void)method1; 
@end 

ClassA.m

#import "ClassA.h" 

// private property 
@interface ClassA() 
@property (nonatomic) NSString *s; 
@end 

@implementation ClassA 
@synthesize s; 

-(void)method1 
{ 
    self.s = @"a"; 
    NSLog(@"%@", [NSString stringWithFormat:@"%@ - method1", self.s]); 
} 
@end 

를 ClassA + Category.h

:

다음 코드는 개인 속성 카테고리 다시 선언되는 코드이며

#import "ClassA.h" 

@interface ClassA(Category) 
-(void)method2; 
@end 

를 ClassA + Category.m

#import "ClassA+Category.h" 

// redeclare private property 
@interface ClassA() 
@property(nonatomic) NSString *s; 
@end 

@implementation ClassA(Category) 

-(void)method2 
{ 
    NSLog(@"%@", [NSString stringWithFormat:@"%@ - method2", self.s]); 
} 
@end 


인가는 개인 재산에 대한 파일 (를 ClassA + Private.m)를 만들고 ClassA.m과를 ClassA + Category.m에서 가져올 수있는 좋은 방법입니다 :

를 ClassA + Private.m이 문제를 해결하기 위해

@interface ClassA() 
@property(nonatomic) NSString *s; 
@end 

답변

10

가장 좋은 방법은 ClassA+Private.h을 만들고 ClassA.mCategory.m에 가져 오는 것입니다. 결국 h을 염두에 두십시오. 개인 속성과 메소드 만 선언하면 정의는 ClassA.m에 더 잘 보관됩니다.

+3

'.m'에만'ClassA + Private.h'를 임포트하는 것이 더 좋을 것이라고 말하고 싶습니다. 'ClassA.h'에'ClassA + Private.h'를두면 목적을 이겨내지 못하는'ClassA.h'를 임포트하는 모든 클래스가 속성을 볼 수있게됩니다. –

+0

또한,'ClassA + Protected.h'는'ClassA + Private.h'보다 더 정확할 것이라고 생각합니다. –

+0

1에 동의하고 대답을 편집했습니다. protected에 관해서는, 나는 이것이 눈을 피로하게 만드는 것에 동의하지만 다른 프로그래밍 언어에서 온 사람들에게는 아무런 차이가 없기 때문에 질문의 저자가 제안한 명명법을 사용했습니다. – lawicko

관련 문제