Как использовать метод для изменения указателя?

StackOverflow https://stackoverflow.com/questions/4635731

Вопрос

Я работаю над приложением для 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 не может быть обычным указателем (в отличие от указателя указателя) Отказ

Это было полезно?

Решение

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

- (void) createArray: (NSMutableArray**) newArray
{
    NSAssert(newArray, @"I need a pointer, sweetheart.");
    *newArray = [[NSMutableArray alloc] init];
    [*newArray addObject:...];
}

Другие советы

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

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

NSMutableArray * list = [ClassB mutableArrayFromSQLite];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top