Я относительно новичок в 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.