Передать объект NSMutableArray - PullRequest
       8

Передать объект NSMutableArray

2 голосов
/ 25 сентября 2008

Я заблудился в стране указателей, я верю. У меня есть это (синтаксис кода может быть немного не так, я не смотрю на машину с этим кодом ... но все соответствующие детали верны):

NSMutableArray *tmp = [[NSMutableArray alloc] init];

Я передаю это рутине в другом классе

- (BOOL)myRoutine: (NSMutableArray *)inArray
{
    // Adds items to the array -- if I break at the end of this function, the inArray variable has a count of 10
}

Но когда код возвращается в вызывающую подпрограмму, [счетчик tmp] равен 0.

Я, должно быть, упускаю что-то очень простое, но в то же время очень фундаментальное, но для своей жизни я этого не вижу. Кто-нибудь может указать, что я делаю не так?

РЕДАКТИРОВАТЬ: www.stray-bits.com спросил, сохранил ли я ссылку на него, и я сказал: «Может быть ... мы попробовали это: NSMutableArray * tmp = [[[NSMutableArray alloc] init] сохранить]; не конечно, если ты это имеешь в виду, или я все сделал правильно.

РЕДАКТИРОВАТЬ2: Майк МакМастер и Энди - вы, ребята, вероятно, правы тогда. У меня нет кода здесь (он находится на компьютере коллеги, и они ушли на день), но чтобы заполнить массив значениями, мы что-то делали по аналогии с использованием объекта декодера (?).

Цель этой функции - открыть файл с iPhone, прочитать этот файл в массив (это массив объектов, которые мы сохранили при предыдущем запуске программы). У этой вещи "декодера" есть метод, который помещает данные в массив.

Чувак, я полностью убил это. Я очень надеюсь, что вы все можете следовать, и спасибо за совет. Мы рассмотрим это более внимательно.

Ответы [ 5 ]

2 голосов
/ 25 сентября 2008

Вам нужно показать нам немного больше о том, как вы добавляете объекты в массив, чтобы мы действительно помогли.

Я видел, как многие люди пишут такой код:

NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:0];

array = [foo bar];

Люди, которые делают это, думают, что он «создает, а затем устанавливает» изменяемый массив, но это совсем не то, что он делает. Вместо этого он создает изменяемый массив, назначает его переменной с именем array и затем присваивает этой переменной другой изменяемый массив.

Поэтому убедитесь, что вы не путаете переменную для объекта, на который она ссылается. Объект не является переменной, он взаимодействует с через переменной.

2 голосов
/ 25 сентября 2008

Вам не нужно звонить удерживать в этом случае. [[NSMutableArray alloc] init] создает объект с счетом сохранения 1, поэтому он не будет освобожден, пока вы его не отпустите.

Было бы хорошо увидеть больше кода. Я не думаю, что ошибка в очень маленькой сумме, которую вы опубликовали до сих пор ..

2 голосов
/ 25 сентября 2008

Я согласен с Майком - на основании кода, который вы разместили, он выглядит правильно. В дополнение к публикации кода, используемого для вызова функции и добавления элементов в массив, вы можете попробовать проверить адреса памяти указателя в конце функции (когда она имеет все объекты), а также после ее возвращения. (когда у него нет объектов). Я не уверен, почему это было бы по-другому, но опять же, элементы должны слипаться и в массиве.

1 голос
/ 29 сентября 2008

Код, который вы разместили, должен работать. Вы должны делать что-то смешное в функции декодера.

Вы не должны сохранять этот массив. Он автоматически сохраняется с init. Если вы сохраните его, вы потеряете память. Если вы только начинаете с цели c, найдите время и прочитайте «Введение в Руководство по программированию управления памятью для какао». Это избавит вас от головной боли.

Почему вы пишете так много кода для чтения массива из файла? Это уже поддерживается фреймворком:

+ arrayWithContentsOfFile:

Возвращает массив, инициализированный из содержимого указанного файла. Указанный файл может быть полным или относительный путь; файл, который это имена должны содержать строку представление массива, такого как что производится writeToFile: атомарно: метод.

Так что вы можете сделать это:

NSMuatableArray *myArray = [NSMutableArray arrayWithContentsOfFile:@"path/to/my/file"];

Это удобный метод, поэтому объект будет автоматически освобожден. Обязательно сохраните этот файл, если хотите его сохранить.

1 голос
/ 25 сентября 2008

NSMutableArray сохраняет объекты, добавленные к нему, но вы сохранили сам массив?

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