【问题标题】:Calling NSMutableArray:addObject is resulting in an unrecognized selector exception调用 NSMutableArray:addObject 导致无法识别的选择器异常
【发布时间】:2013-03-31 03:25:53
【问题描述】:

我在尝试调用数组上的 addObject 时遇到无法识别的选择器异常。但是我的数组是 NSMutableArray,而不是 NSArray。我不明白为什么会这样。

我有以下课程:

@interface A : NSObject
@property (nonatomic, copy)     NSMutableArray* children;
- (id) init;
- (void) addChild: (A*) child;
@end

@interface B : A
- (id) init;
@end

@implementation A
- (id) init 
{ 
   self = [super init];
   return self;
} 

- (void) addChild: (A*) child
{
    [self.children addObject:child];
}
@end


@implementation B
-(id) init 
{
    self = [super init];
    if (self != nil)
    {
           self.children = [[NSMutableArray alloc] init];
    }
    return (self);
}

然后,如果我创建一个 B 类型的对象并调用 [b addChild: anObject] 我得到一个无法识别的选择器,我不明白为什么。

输出是:

2013-04-08 14:31:08.046 otest[13381:7e03] -[__NSArrayI addObject:]: unrecognized selector sent to instance 0x17759c0

有什么问题?

TIA

(请关注实际的代码和问题,而不是讨论为什么我不在 A 的 init 中分配数组,除非相关。我想了解为什么现在的代码不起作用。谢谢)。

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    通过使用存储限定符 copy 而不是 strong 声明数组,您的可变数组将在分配时被复制并变成不可变的 NSArray。

    【讨论】:

    • 许多我提到的消息来源说,制作可变项目是一种很好的做法,例如 NSMutableString 和 NSMutableArray 复制而不是强。如果是这种情况,那么在遵循良好实践的同时让其发挥作用的解决方案是什么?
    • 当您想要防范可变赋值时,这是一个很好的做法。在你的情况下,你真的想要一个可变数组,所以复制总是错误的举动。
    • @Mungbeans,这是一篇博客文章,其中有一些关于您可能会考虑的建议(包括编写自己的 setter 例如):vgable.com/blog/2009/03/17/mutable-property-and-copy-gotcha
    • 创建一个可变数组的 mutableCopy 与保留完全相同。我认为没有理由修改任何 setter 或 getter 来模拟 mutableCopy-esque 存储限定符。
    猜你喜欢
    • 1970-01-01
    • 2018-02-15
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多