Вызываете «релиз» слишком много раз? - PullRequest
5 голосов
/ 18 июня 2010

Я просматривал чей-то код и заметил, что они вызвали 'release' для строки NSSt, которой они не владеют (никогда нигде не вызывали alloc / retain / copy, и это не было свойством).

Это выглядело немного странно для меня, и это заставило меня задаться вопросом, может ли происходить какое-то странное поведение, если вы вызываете 'release' для объекта, который вы либо не "владеете", либо чей счетчик ссылок уже равен 0? Приведенный ниже код компилируется / работает нормально без предупреждений, так что, думаю, проблем нет, но мне было просто любопытно.

// Releasing an object I don't own
NSString *notMyString = [NSString stringWithString:@"Not mine."];
[notMyString release]; // Ignored?

// Releasing an object I own, twice
NSString *myString = [[NSString alloc] initWithString:@"Mine."];
[myString release]; // Ref count = 0
[myString release]; // Ref count = ?

1 Ответ

15 голосов
/ 18 июня 2010

Да, не делай этого. Ваша оценка верна, как и ваше понимание правил владения. Отправка сообщения в уже освобожденный объект имеет неопределенное поведение - иногда вам везет из-за того, что происходит что-то другое, и ничего не происходит. Иногда вы сразу же терпите крах, иногда позже, потому что вы испортили что-то еще.

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