2008-09-24 2 views
2

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

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.

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

EDIT: www.stray-bits.com спросил, сохранил ли я ссылку на него, и я сказал «возможно ... мы пробовали это: NSMutableArray * tmp = [[[NSMutableArray alloc] init] сохранить]; не уверен, что это то, что вы имеете в виду, или если я это сделал правильно.

EDIT2: Майк Макмастер и Энди - вы, ребята, вероятно, правы. У меня здесь нет кода (он находится на машине коллеги и они ушли на день), но для заполнения массива значениями мы делали что-то по линии использования объекта декодера (?).

Назначение этой функции - открыть файл с iPhone, прочитайте этот файл в массиве (это массив объектов, который мы сохранили в предыдущем r un программы). Эта вещь «декодера» имеет метод, который помещает данные в массив.

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

ответ

2

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

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

1

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

+0

Это очень хороший вопрос. Мы попробовали NSMutableArray * tmp = [[[[NSMutableArray alloc] init] сохранить]; , но это, похоже, не имело значения. Это то, что вы имели ввиду? – 2008-09-24 20:54:46

+0

Как уже отмечалось, сохранение не требуется, поскольку только что созданный массив имеет значение удержания 1 по умолчанию. – Andy 2008-09-25 03:58:25

2

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

2

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

Я видел много людей писать код так:

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

array = [foo bar]; 

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

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

1

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

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

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

+ arrayWithContentsOfFile:

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

Таким образом, вы можете сделать это:

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

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