Инициирование NSString вне оператора if (), присвоение его внутри и последующее освобождение вызывает сбой - PullRequest
0 голосов
/ 11 августа 2010

Придерживаясь правила освобождения всего, что я создаю, почему строка [cellText release] вылетает из моего приложения? Это должно быть что-то действительно простое, я довольно новичок в разработке приложений для iPhone.

...

  NSMutableString *cellText = [[NSMutableString alloc] initWithString:@""];

  // the cell is a section cell
  if (/* some condition */) {    
    cellText = @"some text";
  }

  // why does this make the app crash?!  
  [cellText release];

...

Ответы [ 2 ]

1 голос
/ 11 августа 2010

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

В строке cellText = @"some text"; вы назначаете указатель на другой объект.

Вы можете попробовать вместо этого что-то вроде этого

NSMutableString *cellText = nil; // make sure that the pointer is initialized with nil

// the cell is a section cell
if (/* some condition */) {    
    cellText = [[NSString alloc] initWithString:@"some text"];
}

// now you can release it (if it's nil, no problem, because sending a message to nil has no effect) 
[cellText release];
0 голосов
/ 11 августа 2010

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

cellText = @"some text";

, вы забываете свой оригинальный указатель и вместо этого записываете указатель на постоянную строку @"some text".Затем, когда вы пытаетесь release, вы вызываете ошибку, потому что это не объект, который вы выделили, это константа.(Хотя я думаю, что должен иметь возможность отправлять release в постоянную строку, он просто ничего не должен делать, поэтому, если это дает сбой, возможно, немного странный.)исходная строка никогда не освобождается, потому что у вас больше нет указателя на нее для отправки сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...