将更多对象添加到声明为NSMutableArray的IBOutletCollection会导致异常

时间:2013-05-06 19:08:17

标签: ios nsmutablearray unrecognized-selector iboutletcollection

我正在使用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之前,如果我执行lldb:p self.collection则返回 (NSMutableArray *) $0 = 0x071817b0 @"3 objects"

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

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

对此主题的任何想法都将非常感激。

3 个答案:

答案 0 :(得分:2)

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

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

什么是__NSArrayI?

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

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

出了点问题。

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

请仔细检查您的代码。

答案 1 :(得分:0)

我得到了你得到的相同行为,除非我添加一个断点,我知道,

$0 = 0x07199520 <__NSArrayI 0x7199520>

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

self.collection = [self.collection mutableCopy];

答案 2 :(得分:0)

-(void)setCollection:(NSMutableArray*)collectionParm {
    _collection = [collectionParm mutableCopy];
}