Objective-C appDelegate数组

时间:2011-05-29 21:15:04

标签: objective-c arrays sqlite nsmutablearray

我正在创建一个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?

3 个答案:

答案 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)

真正发生的是您在第一行创建了一个实际数组,但在接下来的两行中,您modelArraydetailArray指向相同的真正的内存之前创建的数组。因此,无论何时修改第一个,第二个仍指向那里,而不是单独的副本。