10

클래스의 개인 속성을 선언 할 가능성에 대해서는 해당 클래스의 구현 파일 (.m)에 선언 된 해당 클래스의 이름없는 범주에 넣어서 알 수 있습니다. 그게 내가하고 싶은 게 이 아니라입니다.명명 된 범주 내에서 개인 속성을 선언하려면 어떻게해야합니까?

클래스에서 일부 기능을 추가하는 명명 된 카테고리를 다루고 있습니다. 이 기능을 사용하려면 내 범주에서 사적 재산을 사용하는 것이 도움이 될 것입니다. 따라서이를 달성하는 일반적인 방법은 저에게 효과적이지 않습니다. 아니면 그렇습니까? 제발 저를 계몽하십시오!

답변

22

카테고리의 구현 파일에서 다른 카테고리를 선언하고 MyCategoryName_Private과 같은 것으로 여기에 사유 재산을 선언하십시오. 연결된 객체를 사용하여 -propertyName-setPropertyName: 메소드의 구현을 제공하십시오.

예를 들어, 구현 파일은 다음과 같습니다

#import "SomeClass+MyCategory.h" 
#import <objc/runtime.h> 

@interface SomeClass (MyCategory_Private) 

@property (nonatomic, strong) id somePrivateProperty; 

@end 

@implementation SomeClass (MyCategory_Private) 

static void *AssociationKey; 

- (id)somePrivateProperty 
{ 
    return objc_getAssociatedObject(self, AssociationKey); 
} 

- (void)setSomePrivateProperty:(id)arg 
{ 
    objc_setAssociatedObject(self, AssociationKey, arg, OBJC_ASSOCIATION_RETAIN); 
} 

@end 

@implementation SomeClass (MyCategory) 

// implement your publicly declared category methods 

@end 
+1

Yahey을, 대단히 감사합니다! 그것이 내가 찾고 있었던 바로 그 것이다! 어쩌면 어떤 사람들은 이것이 최고의 코딩 실습이 아니라고 생각할 것입니다. 어쨌든 이것은 내 문제를 해결하고 나를 위해 훨씬 더 쉽게 물건을 만듭니다. –

+1

Beautiful. 고맙습니다! – theDuncs

+0

개인 속성이 더 필요하면 더 많은 AssociationKeys를 만들어야한다고 생각합니까? – allenlinli