2016-06-30 2 views
1

의 인스턴스 변수 내가 NSDictionary에카테고리

에 대한

범주를 정의 선언있는 NSDictionary + AddMyFunc.m

// Compiler error: expected identifier or '(' 
@implementation NSDictionary (AddMyFunc) { 
    NSInteger myNum; 
} 

- (void)myFunc { 
    //Compiler error: use of undeclared identifier 'myNum' 
    myNum = //some operation 
} 

@end 

내가 위의 방법으로 그것을했다,myNum 변수 인스턴스를 정의하려면, 하지만 위의 컴파일러 오류가 나타납니다. 왜 이러한 오류가 발생합니까? 어떻게 제거합니까?

+0

왜 downvote? 인터넷에서 답변을 찾을 수 없으므로 여기에서 물어 봅니다. 무엇이 잘못 되었습니까? 다른 사람들도 저와 같은 혼란을 겪을 수 있습니다. 질문에 대한 설명은 downvote보다 낫습니다. –

답변

0

인스턴스 변수는 범주에서 지원되지 않습니다. 인스턴스가 실제로 무엇인지, 그리고 스토리지가 할당되는 방법을 알고 있다면 이는 의미가 있습니다.

범주는 순서에 관계없이로드 될 수 있기 때문에 컴파일러와 링커가 인스턴스 변수의 주소를 알 수있는 방법이 없습니다.

속성을 모방해야하는 경우 연결된 개체를 사용하십시오.

0

당신은 당신은 클래스 확장이 기능을 사용할 수없는 카테고리와 인스턴스 변수를 주입 기능을 사용하려고

#import <objc/runtime.h> 

static const void *ImageTagKey = &ImageTagKey; 

@implementation UIImage (Tagged) 

- (void)setTag:(NSSting *)tag 
{ 
    objc_setAssociatedObject(self, ImageTagKey, tag, OBJC_ASSOCIATION_COPY_NONATOMIC); 
} 

- (NSString *)tag 
{ 
    return objc_getAssociatedObject(self, ImageTagKey); 
} 

@end 
1

관련 개체를 사용하여 카테고리에 속성을 추가 할 수 있습니다. 클래스 확장은 카테고리보다 강력하지만 다른 사람들의 클래스에는 추가 할 수 없습니다. 이 같은 연관된 객체를, 당신의 카테고리에 인스턴스 변수와 같은 역할을하는 속성을 추가 사용하기 위해

:

@interface NSDictionary (AddMyFunc) 
@property (nonatomic, assign) NSNumber *myNum; 
@end 

구현 :

이 속성은 진정한 인스턴스가 아닌 변수이므로 포인터 -> 구문을 사용하여 액세스 할 수 없습니다. 그러나 도트 구문과 대괄호 구문을 모두 사용할 수 있습니다.

+0

마이너 nitpick. 솔루션은 인스턴스 변수를 추가 할 수 없습니다. 속성을 추가 할 수 있습니다. – rmaddy

+0

@rmaddy 이것은 공정한 관찰이며, 나는 그것이 진정한 인스턴스 변수가 아니라 속성이라는 것을 명확히하기 위해 편집했습니다. 감사! – dasblinkenlight

관련 문제