iphone: сообщение отправлено на освобожденный экземпляр - PullRequest
0 голосов
/ 07 сентября 2010

, если я запускаю этот код:

NSString *xml = [[NSString alloc] init];
xml=[NSString stringWithFormat:@"<%@>", @"msg"];
NSLog(@"%@\n",xml);
[xml release];

Я получил:
2010-09-07 11:45:15.523 test[1312:207] <msg>
2010-09-07 11:45:15.527 test[1312:207] *** -[CFString release]: message sent to deallocated instance 0x3d52ba0

У меня есть красный проводник памяти, и я думаю, что:если я создаю объект, используя методы alloc & init, я должен освободить этот объект, но здесь правило не очень хорошо работает, почему?

ОБНОВЛЕНО

кажется, что эта строка xml=[NSString stringWithFormat:@"<%@>", @"msg"]; является проблемой.Я заменил его на xml=@"something";, и это сработало.

Есть идеи, почему я не могу использовать здесь метод stringWithFormat?

ОБНОВЛЕНО
Спасибо заответы @ (Douwe Maan, BoltClock, Rod)

Я обновил код, просто тестирую другой способ:

NSString *xml = [[NSString alloc] initWithFormat,@"<%@>", @"msg"];
NSLog(@"%@\n",xml);
[xml release];

интересно: если я запускаю этот код с включенной опцией отладки, я получаюсообщение: *** -[CFString _cfTypeID]: message sent to deallocated instance 0x3954ab0

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

questions:
1. это нормально, что ошибкасообщение не появится, если я не запускаю проект с помощью инструмента отладки?
2. Итак, в чем проблема с initWithFormat ?, это то же самое, что stringWithFormat?(я думаю, что он не создает автоматически выпущенный экземпляр)
3. Как я могу знать, что какой-то метод возвращает автоматически выпущенный экземпляр ?, есть ли какое-либо соглашение об именовании где-нибудь?

Ответы [ 2 ]

3 голосов
/ 07 сентября 2010

И @"some string" (очевидно, нет, прочитайте второй комментарий @ BoltClock) и [NSString stringWithFormat:@"some string with object: %@", someObject] возвращают autorelease d экземпляр NSString.Вы можете использовать этот объект так, как вам нравится, но вы не являетесь его владельцем (поскольку вы его не alloc, copy или retain), поэтому вам не нужно и не должно release it it.

Кроме того, в вашем коде у вас фактически есть два NSString объекта: тот, который вы alloc 'd (в строке 1), и тот, который alloc' создан для вас.когда вы вызываете stringWithFormat: в строке 2. В строке 2 вы перенаправляете переменную xml ко второму NSString, но первая все еще присутствует в памяти, поэтому вы создаете утечку памяти(так как вы этого не сделали)!В любом случае вам не нужно было alloc этот первый, так как ваш второй NSString - единственный, который вы на самом деле используете.

Таким образом, правильный код будет таким, избавиться от releaseвызов и первый NSString:

NSString *xml = [NSString stringWithFormat:@"<%@>", @"msg"];
NSLog(@"%@\n", xml);

Вопросы:

  1. Хмм, я не уверен, почему эта ошибка возникла в первую очередь ...
  2. init... следует вызывать после alloc что-то, поэтому всегда [[Object alloc] initWithSomething].Autorelease-версия этого [Object objectWithSomething], что по сути делает это: return [[[Object alloc] initWithSomething] autorelease].
  3. Вам не нужно знать, что делает и не возвращает автоматически выпущенный объект, только то, что у вас есть, идолжен таким образом выпускать, а не владеть.У вас есть все, что вы alloc, copy или retain, и вам не принадлежит все остальное.
0 голосов
/ 07 сентября 2010

Вы можете использовать stringWithFormat в своем коде. Правильный код будет

NSString *xml=[NSString stringWithFormat:@"<%@>", @"msg"];
NSLog(@"%@\n",xml);

Сообщение stringWithFormat размещается в пуле автоматического выпуска. Таким образом, он освобождается автоматически. Вы повторно используете переменную xml и «теряете» указатель, который был впервые выделен.

Если вы хотите сохранить значение xml по какой-то причине, вы можете попробовать

NSString *xml = [[NSString alloc] init];
NSString *newXml=[NSString stringWithFormat:@"<%@>", @"msg"];
NSLog(@"%@\n",newXml);
[xml release];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...