Как использовать метод для изменения указателя? - PullRequest
2 голосов
/ 08 января 2011

Я работаю над приложением для iPhone, используя цель C. У меня есть класс A, который создает указатель NSMutableArray под названием «список». Но в классе А я никогда не создаю объект, на который он может указывать. Вместо этого я вызываю метод класса в классе B, чтобы получить некоторые данные из базы данных sqlite, и заполняю там объект NSMutableArray. Я хочу иметь возможность установить указатель в классе A, чтобы он указывал на объект NSMutableArray, созданный в методе класса B, передавая его в качестве аргумента методу. Я не могу сделать это, возвращая массив, потому что я хочу вернуть результат sqlite.

Интересно, правильно ли я это делаю? Я еще не написал весь метод (когда он будет сделан, это будет довольно долго), но я хочу знать, правильно ли я делаю указатель, прежде чем приступить к остальным.

//ClassA.m

//...
NSMutableArray *list;
[ClassB populateArrayFromSqlite:&list];
//Now do stuff with "list", which should point to the array created in populateArrayFromSqlite
//...

//ClassB.m
+(int)populateArrayFromSqlite:(NSMutableArray**)ar {
    NSMutableArray *array = [[NSMutableArray alloc] init];
    //Here there will be code that populates the array using sqlite (once I write it)
    //And then I need to set the "list" pointer in ClassA.m to point to this array
    ar = &array; //Is this how?

    return resultFromSqlite;
}

Я правильно сделал? Или я чего-то не понимаю? Я предполагаю, что этот материал указатель-на-указатель просто не щелкает со мной еще. Прочитав несколько общих источников об указателях, я подозреваю, что именно так я и поступлю, но часть меня не понимает, почему аргумент ar не может быть просто обычным указателем (в отличие от указателя на указатель) .

Ответы [ 2 ]

6 голосов
/ 08 января 2011

Указатели на указатели немного эшеричны, да. Простой способ сделать это - создать пустой массив в A и передать обычный указатель массива в B, который просто заполнит его. Если вы настаивали на создании массива в B, я думаю, вы могли бы сделать это:

- (void) createArray: (NSMutableArray**) newArray
{
    NSAssert(newArray, @"I need a pointer, sweetheart.");
    *newArray = [[NSMutableArray alloc] init];
    [*newArray addObject:...];
}
2 голосов
/ 08 января 2011

Изменение указателей на такие объекты довольно редко встречается в Objective-C. Основное время, когда мы видим подобные вещи, - это когда у метода есть потенциальная ошибка, после чего мы передаем указатель на ссылку NSError. Например, NSFileManager s - (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error.

Гораздо более распространенный способ сделать это состоит в том, чтобы метод возвращал массив:

NSMutableArray * list = [ClassB mutableArrayFromSQLite];
...