попытка случайного броска неизменного объекта - PullRequest
0 голосов
/ 30 августа 2011

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

     sharedManager.ce_name=name.text


    [sharedManager.ce_name replaceOccurrencesOfString:@" " withString:@"%20"
     options:NSLiteralSearch range:NSMakeRange(0, [sharedManager.ce_name length])];

В этот момент это всегда давало мне «попытку изменить неизменный объект» - это было не случайно

Когда я впервые получил эту ошибку, я изменил ее на

    sharedManager.ce_name=(NSMutableString *)name.text

Это все-таки дало мне попытку изменить ошибку неизменяемого объекта, но это могло произойти случайно - странно, верно?

Затем я изменил его на

    NSMutableString *mutable_name = [NSMutableString stringWithString:name.text];

    sharedManager.ce_name=mutable_name;

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

мои вопросы:

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

2) Почему актерский состав в стиле C не исправил это?

3) Будет ли работать мое текущее исправление?

Спасибо за ваше время:)

Ответы [ 3 ]

4 голосов
/ 30 августа 2011

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

Итак, если у меня есть указатель на класс Car: Car * mycar; и я приведу его к объекту Person: (Person *) mycar;, программа попытается получить доступ к памяти, как если бы она была указывая на объект Person. Тем не менее, автомобиль - это не человек, за исключением старого телевизионного комедийного сериала, поэтому, когда он пытается получить доступ к членам этой функции или вызова функций, он попытается перейти в область памяти, которая содержит нечто иное, чем ожидалось, и не определена. вещи случаются (как правило, сбой).

NSMutableString и NSString несовместимы в этом отношении, и поэтому приведение одного к другому приведет к ужасным временам. Ваше исправление ([NSMutableString stringWithString:]) является правильным решением.

2 голосов
/ 30 августа 2011

Не видя хотя бы объявлений задействованных переменных, сложно сказать наверняка, но ваше окончательное решение, создание новой изменяемой строки, вероятно, является правильным решением. Что касается ваших вопросов,

  1. Не управление памятью как таковое, но, вероятно, оно перезаписывало то, чего не должно быть где-то.
  2. Приведения не могут изменить основной тип объекта. У вас есть (предположительно) строка NSString, и все актеры в мире не могут превратить ее в строку NSMutableString.
  3. Как я уже сказал, возможно, но нам нужно увидеть больше кода, чтобы убедиться. Это, безусловно, намного лучше.
2 голосов
/ 30 августа 2011
  1. Если он делал это случайным образом, это означает, что name.text иногда был изменяемой строкой, а иногда неизменной строкой.

  2. Приведение между такими объектами не меняет класс объекта. Это не сделает ваш неизменный объект изменчивым.

  3. Это "исправление", вероятно, лучший способ сделать это (по крайней мере из того, что я вижу в коде, который вы показываете)

...