目标C的appDelegate阵列(Objective-C appDelegate array)

2019-10-29 19:19发布

我创建一个SQLite的应用程序,有两个简单的看法。 我在SQLAppDelegate两个数组:

- (void)applicationDidFinishLaunching:(UIApplication *)application {

    NSMutableArray *tempArray = [[NSMutableArray alloc] init];
    self.modelArray = tempArray;
    self.detailArray = tempArray;
    [tempArray release];

所以,现在在我的实现文件中我填充“modelArray”用一个SQLite表中的内容,并在第一视图中显示此:

+ (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在上面的代码?

Answer 1:

self.modelArray = tempArray;
self.detailArray = tempArray;

这里既有您的实例变量数组包含指针,指向同一的NSMutableArray实例(假设你的属性具有保留属性),因此更改IVARS的一个也应用于另一个(因为它们指向相同的对象)。

为了解决这个问题初始化不同的NSMutableArray是你的阵列:

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    self.modelArray = [NSMutableArray array];
    self.detailArray = [NSMutableArray array];
    ...


Answer 2:

您分配相同的NSMutableArray对象到两个不同的变量。

你需要的是创造2个临时阵列和使用它们。



Answer 3:

真正的情况是,你创建的第一行实际阵列,但在接下来的两个你让modelArraydetailArray指向内存阵列之前创建同一个真实 。 因此,只要您修改的第一个,第二个仍然是指向那里,不是一个独立的副本。



文章来源: Objective-C appDelegate array