0

我正在使用 iPad 6.1 模拟器,但我不明白为什么当我尝试将另一个对象添加到 IBOutletCollection 时会导致错误

__NSArrayI addObject:发送到实例的无法识别的选择器。

我建立了一个测试项目并在下面证明了它:

ViewController.m

@interface ViewController ()

@property (strong, nonatomic) IBOutletCollection(UILabel) NSMutableArray *collection;

@property (strong, nonatomic) NSMutableArray *collection2;

@end

@implementation ViewController

-- (void)viewDidLoad
{

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.
    UILabel *label = [[UILabel alloc]init];

    // Test 1 - Pass
    NSMutableArray *array = [[NSMutableArray alloc]init];
    [array addObject:label];

    // Test 2 - Pass
    _collection2 = [[NSMutableArray alloc]init];
    [self.collection2 addObject:label];



    // Test 3 - Fails   
    [self.collection addObject:label];

}

@end

就在测试 3 之前,如果我执行 alldb:p self.collection它会返回 (NSMutableArray *) $0 = 0x071817b0 @"3 objects"

它所指的三个对象是我通过 IB 连接的对象。不知何故,我认为 XCode 4.3.2 在撒谎,集合必须是 NSArray。

我也尝试[_collection addObject:label]过同样的结果。

任何关于这个主题的想法将不胜感激。

4

3 回答 3

2

如果我们查看您的错误信息,

__NSArrayI addObject:无法识别的选择器发送到实例

__NSArrayI 是什么?

__NSArrayI是不可变数组 (NSArray) 的代码字

这意味着,错误试图告诉您您正在调用 NSArray 的 addObject: 方法。NSArray 没有 addObject: 方法。

出了点问题。

self.collection已成为 NSArray,而不是 NSMutable 数组。可能是您将 NSArray 分配给 self.collection,或者您已将 self.collection 重新初始化为 NSArray。

请仔细检查您的代码。

于 2013-05-06T19:22:58.277 回答
0

我得到与你相同的行为,除了添加断点时,我得到,

$0 = 0x07199520 <__NSArrayI 0x7199520>

看起来 NSMutableArray 声明不起作用,即使文档说您可以在 NSArray 或 NSMutableArray 前面使用 IBOutletCollection。我发现我可以使用 viewDidLoad 中的以下行来解决问题:

self.collection = [self.collection mutableCopy];
于 2013-05-06T20:14:41.147 回答
0
-(void)setCollection:(NSMutableArray*)collectionParm {
    _collection = [collectionParm mutableCopy];
}
于 2013-05-06T21:07:55.780 回答