해당 범주에서 클래스의 개인 속성에 액세스하려고합니다.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
'.m'에만'ClassA + Private.h'를 임포트하는 것이 더 좋을 것이라고 말하고 싶습니다. 'ClassA.h'에'ClassA + Private.h'를두면 목적을 이겨내지 못하는'ClassA.h'를 임포트하는 모든 클래스가 속성을 볼 수있게됩니다. –
또한,'ClassA + Protected.h'는'ClassA + Private.h'보다 더 정확할 것이라고 생각합니다. –
1에 동의하고 대답을 편집했습니다. protected에 관해서는, 나는 이것이 눈을 피로하게 만드는 것에 동의하지만 다른 프로그래밍 언어에서 온 사람들에게는 아무런 차이가 없기 때문에 질문의 저자가 제안한 명명법을 사용했습니다. – lawicko