Почему мой объект все еще работает после бесчисленных выпусков? - PullRequest
4 голосов
/ 11 июля 2011

Я никогда не смогу освободить свой NSMutableString, как показано ниже. Начальный счет сохранения должен быть равен 1, но после освобождения несколько раз строка все еще пригодна для использования, как будто ничего не произошло!

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // insert code here...
    NSMutableString* s = [[NSString alloc]initWithString:@"AAA"];
    [s release];
    [s release];
    [s release];
    [s release];
    [s release];

    NSLog(@"%@",s);

    [pool drain];
    return 0;
}

Конечно, если я использую Analyze, он все равно говорит мне, что я освобождаю освобожденный объект на втором release.

Ответы [ 2 ]

9 голосов
/ 11 июля 2011

Ответ Скотта является правильным общим, но в данном конкретном случае причина в том, что литералы NSString (т. Е. @ "") Являются уникальными константами времени компиляции и фактически ничего не делают, когда сохраняются и освобождаются.Ваше присвоение ему NSMutableString * фактически не делает его NSMutableString, поэтому то, что вы написали, эквивалентно

[@"AAA" release];
[@"AAA" release];    
[@"AAA" release];
[@"AAA" release];
[@"AAA" release];
[@"AAA" release];
8 голосов
/ 11 июля 2011

Освобождение объекта сообщает среде выполнения, что он может уничтожить объект, по крайней мере, насколько вам известно, но он не требует немедленного уничтожения объекта: После вашего первого [s release] Какао может делать все, что пожелает, с памятью, ранее использовавшейся s.Это может дать эту память следующему объекту, который выполняет alloc, и в этом случае ваши последующие попытки получить доступ к s приведут к пламенному аварийному завершению во время выполнения ... или это может не понадобиться сразу же, в этом случае вы можетеполучите доступ к освобожденному объекту.

Практическое правило меньше: «Я выпустил этот объект, что означает, что он больше не существует», и больше: «Я выпустил этот объект, что означает, что он больше не существует».гарантированно существует. "

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