в конечном счете, поведение определяется реализацией NSString - просто используйте retain / release правильно в каждом случае, и вы будете в безопасности.
что, вероятно, происходит: литералы NSString бессмертны.вы можете написать while (1) { [@"String" release]; }
и проблем не будет.
вызванный вами копирующий ctor, вероятно, вернет указатель на строковый литерал.в псевдокоде:
- (id)initWithString:(NSString *)str
{
self = [super init];
if (self != nil) {
if ([str _isStringLiteral] || [str _isImmutable]) {
[self release];
return [str retain];
}
...
}
, в этом случае вам возвращается указатель на строковый литерал при пропуске через [[NSString alloc] initWithString:stringLiteral]
.поскольку отправка release
в бессмертный строковый литерал ничего не делает, вы можете понять, почему он по-прежнему является допустимым объектом после того, что, как вы можете предполагать, является освобожденным объектом.
никогда не полагается на такие детали / оптимизации, просто используйте обычныйвремя жизни и подсчет ссылок, и все будет в порядке.