Когда объект, кажется, меняет класс, это происходит почти всегда, потому что он был освобожден, а другой объект теперь находится в той же области памяти. Все переменные объекта на самом деле указывают на области памяти (это то, что означает *), и в отличие от многих других языков, вы всегда должны помнить, что работаете с областями памяти. (Ну, не всегда, когда вы освоитесь с этим. Но определенно, когда вы отлаживаете.)
Для устранения этих проблем может быть очень полезно использовать NSZombie
. Просто поищите информацию в SO или в Интернете.
тогда в .m файле я его синтезирую:
curTitle = [[NSString alloc] init];
Это , а не синтез. Здесь вы просто присваиваете значение переменной. Точнее, вы создаете объект где-то в памяти (alloc) и инициализируете его (init), а затем устанавливаете значение curTitle
, чтобы указать на эту область памяти.
Вам вообще не нужно указывать эту строку в своем коде.
curTitle = string;
Здесь вы перезаписываете старое значение curTitle
с указателем на другую строку. Скорее всего, ваша проблема заключается в том, что эта другая строка впоследствии освобождается, а область памяти повторно используется для хранения другого объекта (словарь в данном случае). (Если вы не знаете о механизмах сохранения / разблокировки, вам необходимо ознакомиться с ними, чтобы понять, что происходит.)
slide.title = curTitle;
Поскольку curTitle
указывает на область памяти, которая была повторно использована для хранения случайного объекта (или, что еще хуже, мусора), эта строка не будет выполнена. На самом деле, вам повезло, что это не удалось, потому что если это не произойдет (если местоположение еще не использовалось), обнаружить ошибку будет еще сложнее.
Вам нужно объявить свойство, затем синтезировать его и получить доступ к переменной через свойство :
self.curTitle = aString;
Это обеспечит фактическое копирование и владение строкой, так что даже если исходная строка будет выпущена, у вас останется действительная копия.