Массив appDelegate в Objective-C - PullRequest
0 голосов
/ 30 мая 2011

Я создаю приложение 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 строками, но если я сделаю подсчет detailArray после вышеприведенного оператора while, это также возвращает 114?Даже если я не касаюсь detailArray в приведенном выше коде?

Ответы [ 3 ]

3 голосов
/ 30 мая 2011
self.modelArray = tempArray;
self.detailArray = tempArray;

Здесь оба ваших массива переменных экземпляра содержат указатель на один и тот же экземпляр NSMutableArray (при условии, что ваше свойство имеет атрибут retain), поэтому изменения одного из iVars также применяются к другому (поскольку они указывают на одно и то же).объект).

Чтобы исправить это, инициализируйте ваши массивы с помощью различных NSMutableArray:

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    self.modelArray = [NSMutableArray array];
    self.detailArray = [NSMutableArray array];
    ...
2 голосов
/ 30 мая 2011

Что действительно происходит, так это то, что вы создаете фактический массив в первой строке, но в следующих двух вы делаете modelArray и detailArray, указывающие на тот же реальный в памяти массив, который вы создали ранее , Таким образом, всякий раз, когда вы изменяете первый, второй по-прежнему указывает на него и не является отдельной копией.

2 голосов
/ 30 мая 2011

Назначение одного и того же объекта NSMutableArray двум различным переменным.

Вам нужно создать 2 временных массива и использовать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...