我正在创建一个SQLite应用程序,它有两个简单的视图。我在SQLAppDelegate中有两个数组:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
NSMutableArray *tempArray = [[NSMutableArray alloc] init];
self.modelArray = tempArray;
self.detailArray = tempArray;
[tempArray release];
所以现在在我的实现文件中,我使用SQLite表的内容填充“modelArray”并在第一个视图中显示:
+ (void) getInitialDataToDisplay:(NSString *)dbPath {
SQLAppDelegate *appDelegate = (SQLAppDelegate *)[[UIApplication sharedApplication] delegate];
if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {
const char *sql = "select rowid as ID, ManufacturerMake as modelName from sqlitedb group by modelName";
sqlite3_stmt *selectstmt;
if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) {
while(sqlite3_step(selectstmt) == SQLITE_ROW) {
NSInteger primaryKey = sqlite3_column_int(selectstmt, 0);
Model *modelObj = [[Model alloc] initWithPrimaryKey:primaryKey];
modelObj.modelName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)];
[appDelegate.modelArray addObject:modelObj];
[modelObj release];
}
}
}
问题是modelArray正在用114行正确填充,但是如果我在上面的while语句之后计算了 detailArray ,那么它也会返回114?即使我在上面的代码中没有触及detailArray?
答案 0 :(得分:3)
self.modelArray = tempArray;
self.detailArray = tempArray;
这里,两个实例变量数组都包含指向同一NSMutableArray实例的指针(假设您的属性具有retain属性),因此对其中一个iVar的更改也会应用于另一个(因为它们指向同一个对象)。
修复用不同的NSMutableArray初始化数组:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
self.modelArray = [NSMutableArray array];
self.detailArray = [NSMutableArray array];
...
答案 1 :(得分:2)
将相同的NSMutableArray对象分配给两个不同的变量。
你想要的是创建2个临时数组并使用它们。
答案 2 :(得分:2)
真正发生的是您在第一行创建了一个实际数组,但在接下来的两行中,您modelArray
和detailArray
指向相同的真正的内存之前创建的数组。因此,无论何时修改第一个,第二个仍指向那里,而不是单独的副本。