2013-04-08 46 views
0

我收到一個無法識別的選擇器異常,試圖在數組上調用addObject。但是我的數組是NSMutableArray,而不是NSArray。我不明白爲什麼會發生這種情況。調用NSMutableArray:addObject導致無法識別的選擇器異常

我有以下類別:

@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分配陣列,除非相關的。我想知道爲什麼代碼,因爲它代表簡化版,工作,謝謝)。

回答

3

通過聲明存儲限定符copy而不是strong的數組,您的可變數組將在賦值時被複制並轉換爲不可變的NSArray。

+0

許多來源我已經說紅是很好的做法,使可變項目,如NSMutableString和NSMutableArray複製而不是強。如果是這樣的話,那麼在遵循良好實踐的同時還有什麼解決方案能夠實現這一目標? – Gruntcakes 2013-04-08 21:48:41

+0

當你想防範*可變賦值*時,這是一個好習慣。在你的情況下,你真的想要一個可變數組,所以複製總是錯誤的做法。 – CodaFi 2013-04-08 21:49:20

+0

@Mungbeans,這裏有一篇博文,對你可能考慮的事情有一些建議(包括編寫你自己的'setter'):http://vgable.com/blog/2009/03/17/mutable-property-and -copy-gotcha/ – 2013-04-08 21:52:32

相關問題