gpt4 book ai didi

objective-c - 访问类别中的私有(private)变量导致链接器错误

转载 作者:太空狗 更新时间:2023-10-30 03:25:53 27 4
gpt4 key购买 nike

编辑:我不会这样做,我现在意识到这有多么危险。但是,这个问题纯粹出于学术目的。

我正在尝试在 NSCollectionView 上实现一个类别,它可以让我访问私有(private)变量 _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 打印了它的内容。有谁知道解决这个问题的方法吗?

提前致谢!
比利

最佳答案

_displayedItems 是私有(private) ivar,因此您不应访问它,即使是从类别中也是如此。

也就是说,您应该尝试使用以下代码编译相同的代码

gcc -arch i386

gcc -arch x86_64

看看区别。在 32 位模式下,您看不到错误。这表明局势是多么脆弱。你真的不应该。

也就是说,有一种方法可以通过滥用 KVC 来获取该 ivar:

@implementation NSCollectionView (displayedItems)

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

@end

请注意,您不应将您的方法命名为 displayedItems。这会形成无限循环,因为 KVC 机制会比 ivar 更早找到您的方法。参见 here .

或者您可以使用 Objective-C 运行时函数访问任何隐藏的 ivar。这也很有趣。

不过,我再说一遍。知道你可以做一件事和真正去做那件事有很大的不同。想想任何骇人听闻的罪行。并自己完成。

不要那样做!!!!!!

关于objective-c - 访问类别中的私有(private)变量导致链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4429226/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com