2010-04-22 75 views
1

我希望有人能夠理解我的NSMutableArray會發生什麼。對象的NSMutableArray行爲異常

我從數據庫中讀取記錄a,b,c,d,將這些字段加載到對象中並將對象添加到數組中。爲此,我將記錄讀入該對象的實例(tmpEvent),並將該對象添加到目標數組(NSMutableArray myArray)。

代碼如下:

for (condition) { 
    tmpEvent.field1 = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, 0)]; 
    tmpEvent.field2 = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, 1)]; 
    tmpEvent.field3 = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, 2)]; 

    NSLog(@"myArray: adding %@", tmpEvent.field1); 
    [myArray addObject:tmpEvent]; 
} 

的NSLog的顯示

myArray: adding a 
myArray: adding b 
myArray: adding c 
myArray: adding d 

後續I枚舉陣列(這可以是在相同或不同的方法):

for (myObject *records in myArray) { 
    NSLog(@"iEvents value %@", records.field1); 
} 
現在顯示:
myArray value d 
myArray value d 
myArray value d 
myArray value d 

一個謎....有什麼想法嗎?

回答

3

您需要爲每個事件分配一個新的「iEvent」。 tmpEvent.field1指向內存中每個後續添加的相同位置,因此您正在修改已存儲在數組中的對象。 NSArray不會創建對象的新副本,只是存儲其指針/地址。

一個修正:

[myArray的ADDOBJECT:[tmpEvent複製]];

這裏假定iEvent類的成員符合NSCopy。

另一種方法是爲每個要存儲的事件分配一個新的tmpEvent。

問題:但這是否意味着當我釋放我的數組agein時,我需要枚舉並「手動」釋放對象?

回答:您應該在將對象添加到數組後發送該對象,因爲數組會向其發送一個保留。處理數組時,所有對象都會發送一個版本,所以您不必這樣做。見下文......

給的頁頭選項一試爲符合NSCopying需要你無論如何ALLOC對象:

的(條件){ tmpEvent = [[TmpEvent的alloc]初始化] //或者初始化

tmpEvent.field1 = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, 0)]; 
tmpEvent.field2 = ... 

[myArray addObject:tmpEvent]; 

// NSArray保留添加的對象。 [tmpEvent發佈]; }

----符合NSCopy --- 1.類必須從NSCopying @interface TmpEvent繼承:NSObject的...

  • 實現 - (ID)copyWithZone:(NSZone *)區

    • (ID)copyWithZone:(NSZone *)區{ TmpEvent * copyOfMyself = [[ TmpEvent alloc] init]; copyOfMyself.field1 = [self.field1 copy]; ....等

    return copyOfMyself; }

  • +0

    明白,特別喜歡「複製」的選擇。但是這是否意味着當我釋放數組agein時,我需要枚舉並「手動」釋放對象? – iFloh 2010-04-22 13:26:08

    +0

    嗯,剛剛嘗試了複製方法。用無法識別的選擇器獲取未捕獲的異常。 如何讓我的對象符合NSCopy協議?我沒有在蘋果文件中找到它... – iFloh 2010-04-22 13:49:54

    +0

    Wohow ...肯尼,你正在清理很多行李與我在一起。非常感謝,謝謝8-) – iFloh 2010-04-22 14:25:24