NSMutableArray из NSStrings содержит фактические данные или только указатели на данные - PullRequest
0 голосов
/ 24 июля 2010

Я относительно новичок в Objective C, и хотя я работал над написанием приложений для iPhone, думаю, мне нужна помощь в понимании чего-либо.

Я храню динамический список строк в NSMutableArray, который является свойством моего основного класса. В моей инициализации я выделяю и инициализирую для хранения 100 элементов:

stringList = [[NSMutableArray alloc] initWithCapacity:100];

По мере получения строк (из входящих данных) я добавляю их как объекты в массив:

NSString *newString = [stringMaker makeStringFromData:data];
[stringList addObject:newString];

Итак, чтобы понять, что на самом деле здесь происходит. Если я сделал это добавление 5 раз, что я на самом деле имею в NSMutableArray? Просто указатели на 5 строк или фактические строки? Я предположил, что addObject действительно скопировал данные. Если бы мой класс stringMaker начал правильно выпускать вещи, мог бы я в итоге получить указатели на ноль? Есть ли лучший способ убедиться, что строки в моем списке безопасны для освобождения или переназначения на что-то другое? Или я неправильно понимаю, как это работает?

У меня пока нет проблем с этой частью. Но я немного неуверен в утечках и выпусках вещей.

Что привело меня к этому, так это то, что у меня есть проблема, когда я изменяю одну из строк следующим образом:

[stringList replaceObjectAtIndex: stringIndex withObject: stringMaker.lastStringUsed];

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

Чтобы было понятно ... в stringMaker в разных точках я делаю:

 [lastStringUsed setString: someString];

(кстати, ЧТО фактически перемещает данные?)

Затем в моем основном классе я делаю то, что replaceObjectAtIndex показано выше. Затем другой метод stringMaker сбрасывает lastStringUsed. Затем, когда я получаю доступ к своему stringList по этому индексу, это новое значение lastStringUsed, а не то, что было, когда я выполнял replaceObjectAtIndex.

РЕДАКТИРОВАТЬ - РЕШЕНО СЕЙЧАС - ЕЩЕ НУЖНО ЗАНЯТЬ НОЧНОЙ КЛАСС НА ЯРЛЫКАХ И СТРУНАХ, ИХ ПРАВИЛЬНО СОХРАНЯТЬ И ВЫПУСКА

Пока я исправил это, просто выделил новую строку ...

NSString *replacementString = [[NSString alloc] initWithCapacity: 310];
[replacementString setString:stringMaker.lastStringUsed];
[stringList replaceObjectAtIndex:stringIndex withObject:replacementString];

Теперь в следующий раз, когда я изменю lastStringUsed, он также не изменит тот, что в stringList.

1 Ответ

0 голосов
/ 24 июля 2010

Когда вы добавляете объект в массив или словарь, объект будет сохранен этим массивом или словарем. Посмотрите на счет сохранения объекта, который вы помещаете в массив до и после вызова addObject:

...