2010-12-13 7 views
10

편집 : 저는 이것을하지 않을 것입니다. 이제 어떻게 위험 할 수 있는지 깨달았습니다. 그러나 질문은 순전히 학업 목적으로 만 머물러 있습니다.범주의 개인 변수에 액세스하면 링커 오류가 발생합니다.

NSCollectionView에서 개인 변수 _displayedItems에 액세스 할 수있는 범주를 구현하려고합니다. 내 하위 클래스에서 액세스 할 수 있어야합니다. 그래서 다음 카테고리를 만들었습니다 :

@interface NSCollectionView (displayedItems) 

- (NSMutableArray *)displayedItems; 

@end 


@implementation NSCollectionView (displayedItems) 

- (NSMutableArray *)displayedItems 
{ 
    return _displayedItems; 
} 

@end 

... 완벽하게 작동해야하는 것처럼 보입니다 .... 나는이를 컴파일 할 때, 링커는 나에게 다음과 같은 오류 제공 :

Undefined symbols: 
    "_OBJC_IVAR_$_NSCollectionView._displayedItems", referenced from: 
     -[NSCollectionView(displayedItems) displayedItems] in NSCollectionView+displayedItems.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 

내가 _displayedItems이 NSCollectionView에 있는지 아는 사실을, 나는 인터페이스를 보았고, 또한 GDB를 사용하여 내용의 인쇄했습니다. 누구든지이 문제를 해결할 방법을 알고 있습니까?

미리 감사드립니다.
빌리

+0

이 답변이 가장 좋은 것으로 나타났습니다. 간단하고 안전합니다. http : // stackoverflow.com/questions/16678463/접근하는 -a-super-class-when-not-exposed –

답변

12

_displayedItems은 개인용 ivar이므로 카테고리에서도 액세스 할 수 없습니다. 말했다

, 당신은

gcc -arch i386 

gcc -arch x86_64 

과 같은 코드를 컴파일 시도하고 그 차이를 볼 수 있습니다. 32 비트 모드에서는 오류가 표시되지 않습니다. 이것은 상황이 얼마나 연약한지를 보여줍니다. 당신은 정말로해서는 안됩니다.

@implementation NSCollectionView (displayedItems) 

- (NSMutableArray *)myDisplayedItems 
{ 
    return [self valueForKey:@"displayedItems"]; 
} 

@end 

참고 그냥 displayedItems로 방법을 이름을 안 :

말했다

, KVC을 남용하여 해당 바르를 얻을 수있는 방법이있다. 그것은 무한 루프를 만들 것입니다. 왜냐하면 KVC 기계가 당신의 방법을 아이어보다 먼저 발견 할 것이기 때문입니다. here을 참조하십시오.

Objective-C 런타임 기능을 사용하여 숨겨진 ivar에 액세스 할 수 있습니다. 그것은 또한 재미 있습니다.

그러나 다시 말씀 드리겠습니다. 당신이 한 가지 일을 할 수 있고 그 일을 실제적으로 할 수 있다는 점에서 큰 차이가 있습니다. 어떤 흉악한 범죄라도 생각 해봐. 그 일을 혼자서하십시오.

하지 마세요 !!!!!

+0

좋아, 나는 그것을 얻는다, 나쁜 생각. :) 어쨌든 고마워요! – vilhalmer

+1

나는 "do not do"를 맨 위로 옮길 것입니다. :) 프레임 워크 클래스의 내부 상태에 대해 자세히 알기 시작하면 시간이 지남에 따라 충돌과 신비한 실패에 놀라게 될 것입니다. – bbum

+0

@bbum은 상대적으로 무해한 다른 대답에 제안 된'object_getInstanceVariable'이 아닙니까? –

5

당신이해야하지 정말하지만, 구조체의 멤버에 대한 포인터와 같은 액세스 : 나는 당신이 알고 확신

-(NSMutableArray *)displayedItems { 
    return self->_displayedItems; 
} 

이 할 수있는 깨지기 쉬운 일이로 그러나)

UPDATE : 당신이 작동하지 않습니다 위에서 언급 한 이후, 런타임 아래로 떨어 시도 :

-(NSMutableArray *)displayedItems { 
     NSMutableArray *displayedItems; 
     object_getInstanceVariable(self, "_displayedItems", (void *)&displayedItems); 
     return displayedItems; 
} 

(테스트, 작동)

+0

이 방법은 작동하지 않으며 동일한 오류가 발생합니다. 그래도 제안을 주셔서 감사합니다! – vilhalmer

+0

흠, 이런! 내 업데이트를 참조하십시오. – d11wtq

+3

그건 기술적으로 정답이지만 도덕적으로 정확한 대답은 아닙니다 : p – Yuji

관련 문제