2010-12-13 53 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/access-a-super-class-when-not-exposed – 2014-06-06 10:28:38

回答

12

_displayedItems是一個私人ivar,所以你不應該訪問它,即使從一個類別。

這就是說,你應該嘗試與

gcc -arch i386 

gcc -arch x86_64 

編譯相同的代碼,看到了差距。在32位模式下,您看不到錯誤。這表明情況有多脆弱。你真的不應該。

這就是說,有辦法通過濫用KVC來獲取伊娃:

@implementation NSCollectionView (displayedItems) 

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

@end 

注意,你不應該命名您的方法,就像displayedItems。這將會造成無限循環,因爲KVC機器會比伊娃爾早找到你的方法。請參閱here

或者您可以使用Objective-C運行時功能訪問任何隱藏的ivar。這也很有趣。

但是,讓我再說一遍。知道你可以做一件事情並且真正做到這一點,就會有很大的不同。想想任何可怕的犯罪。並自己做。

不要這樣做!!!!!

+0

好吧,我明白了,壞主意。 :) 不管怎麼說,還是要謝謝你! – vilhalmer 2010-12-13 14:34:35

+1

我會將「不要那樣做」移到頂端。 :)如果你開始關注框架類的內部狀態,那麼隨着時間的推移,你一定會對崩潰和神祕故障感到驚訝。 – bbum 2010-12-13 18:14:11

+0

@bbum不是'object_getInstanceVariable'建議在另一個答案中相對無害嗎? – 2013-11-20 17:39:52

5

你應該不是真的,但訪問它像一個指向結構的成員:

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

這是做一個脆弱的東西,因爲我相信你知道然而,)

更新:既然你提到的上述方法無效,嘗試在下降到運行時:

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

(測試工作)

+0

這也行不通,它給出了一個相同的錯誤。還是)感謝你的建議! – vilhalmer 2010-12-13 13:48:33

+0

嗯,德哦!查看我的更新。 – d11wtq 2010-12-13 14:02:50

+3

這是一個技術上正確的答案,但不是一個道德正確的答案:p – Yuji 2010-12-13 14:07:02