我正在使用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]
同样的结果。
对此主题的任何想法都将非常感激。
答案 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];
}