2014-05-14 48 views
0

對不起,我是新來的iOS開發,這一天,我遇到了一個奇怪的問題: 當我從自定義對象刪除對象時,它總是返回崩潰:NSMutableArray裏的removeObject崩潰

原因:「 - [ __NSArrayI removeLastObject]:無法識別的選擇發送到實例

以下代碼:

@interface Base : NSObject 

@property (nonatomic, assign) BOOL isFinish; 
@property (nonatomic, strong) NSString *title; 
@property (nonatomic, strong) NSString *subTitle; 
@property (nonatomic, strong) NSString *tagURL; 
@property (nonatomic, assign) NSInteger taskScore; 
@property (nonatomic, assign) BOOL inProgress; 
@property (nonatomic, assign) NSInteger nowTime; 
@property (nonatomic, assign) NSInteger totalTime; 

@end 

然後我使用另一個類:

@property (nonatomic, strong) NSMutableArray *arr1; 
@property (nonatomic, copy) NSMutableArray *arr2;  

_arr1 = [[NSMutableArray alloc] init]; 
for (int i = 0; i < 10; i++) { 
    Base *b = [[Base alloc] init]; 
    b.title = [[NSString alloc] initWithFormat:@"%d", i]; 
    [_arr1 addObject:b]; 
} 
self.arr2 = [_arr1 copy];// 001, I tried copy or mutable copy 

[_arr2 removeLastObject]; //it always crash in here!! 

所以我通過一些參考一下,有的告訴我必須符合nscopyingnsmutablecopying協議

所以我添加一些方法在基類@implementation

- (id)copyWithZone:(struct _NSZone *)zone 
{ 
    Base *copy = [[[self class] allocWithZone:zone] init]; 
    if (copy) { 
     [copy setIsFinish:[self isFinished]]; 
     [copy setTitle:[self title]]; 
     [copy setSubTitle:[self subTitle]]; 
     [copy setTagURL:[self tagURL]]; 
     [copy setTaskScore:[self taskScore]]; 
     [copy setInProgress:[self inProgress]]; 
     [copy setNowTime:[self nowTime]]; 
     [copy setTotalTime:[self totalTime]]; 
    } 
    return copy; 

} 

但不起作用,有人能幫助我嗎?

回答

4

首先看看你得到的錯誤。它很清楚地表明你發送了「removeObject」給一個不理解它的NSArray,而不是NSMutableArray。合乎邏輯的結論是,在這個時候,_arr2不是一個可變數組,而是一個NSArray。

現在作爲一名軟件開發人員,您應該嘗試通過邏輯思考。你知道複製和mutableCopy之間的區別,對吧?你說你使用了mutableCopy,但是當你設置一個標記爲「copy」的屬性時,你會怎麼想呢?它複製。通過調用複製。所以你製作了可變的nsarray的可變副本,而屬性設置器創建了一個不可變的副本。

+1

如果你(OP)想知道如何解決你的問題 - 你可以改變'@property(nonatomic,copy)NSMutableArray * arr2;'以'@property(nonatomic,strong)NSMutableArray * arr2;'爲例。格納赫的解釋是正確的。 – cania

+0

...並返回到使用可變副本'self.arr2 = [_arr1 mutableCopy];' – vacawama

+0

@cania我想深拷貝.. – passol

2

我認爲你需要使用mutableCopy而不是複製。複製將創建數組的不可變副本。 removeLastObject在Array的可變版本上可用。

+0

什麼是mutablecopyWithZone的最佳實踐實現 – passol