OGeek|极客世界-中国程序员成长平台

标题: objective-c - iOS 和可变 IBOutletCollections [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 22:48
标题: objective-c - iOS 和可变 IBOutletCollections

我有属性(property):

@property(nonatomic, strong) IBOutletCollection(UIView) NSMutableArray *allOpposition;

在 IB 中连接到一堆 subview 并合成。后来我有:

- (void)willRemoveSubviewUIView *)subview
{
  [[self allOpposition] removeObject:subview]; // Crash occurs here.
  [super willRemoveSubview:subview];
}

当需要删除代表相反实体的 View 时,我收到以下错误消息:

-[__NSArrayI removeObject:]: 无法识别的选择器发送到实例 0x88211c0

对象不是 nil 并且包含在集合中。为什么我的数组是不可变的?

备注:在这种情况下,Apple 很可能要求集合中的每个对象都是 UIView 类型。如果数组是完全可变的,我可以添加外来类型。我在这里没有找到太多文档,所以这是我的猜测。

备注:如果返回的数组最终是不可变的,我看不到允许传入可变数组的值(value)。为什么不直接接受不可变数组?



Best Answer-推荐答案


您可能已将该属性声明为可变数组,但我很确定当您的 nib 被加载时,将为其分配一个不可变数组。

覆盖 allOpposition 的合成 setter (我假设您使用的是 xcode4.4 或更高版本以及 ARC):

-(void)setAllOppositionNSMutableArray*)allOpposition
{
    _allOpposition = [allOpposition mutableCopy];
}

您也可以通过将属性声明从 strong 更改为 copy 来实现此目的,但这是猜测。

关于objective-c - iOS 和可变 IBOutletCollections,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12576780/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://sqlite.in/) Powered by Discuz! X3.4