Не понимаю анализ памяти - PullRequest
0 голосов
/ 14 июля 2010

Я обновил свой XCode до версии 3.2.3 для поддержки iOS4 в моем проекте iphone. используя статический анализатор, я проверил наличие проблем с управлением памятью.

В одной из моих процедур я получаю следующую проблему: После добавления события в календарь я создаю предупреждение для пользователя, чтобы придать ему статус.

Это работает нормально, но анализатору памяти не нравится, как я определил предупреждение. Я не вижу проблемы с кодированием, а вы? (Я указал на подсказки анализатора памяти с помощью «<<<<») </p>

- (IBAction) addToCalendar {
        ...
    UIAlertView  *tmpAlert  = [UIAlertView alloc];        <<<<Method returns an Objective-C object with a+1 retain count (owning reference)

    calData.startDate   = iVar.zeitVon;
    calData.endDate     = iEvent.zeitBis;
    calData.title       = iVar.title;
    calData.calendar    = myEventStore.defaultCalendarForNewEvents;

    if ([tmpEventStore saveEvent:tmpEvent span:EKSpanThisEvent error:&tmpSaveError]) {
        // Show a save success dialog
        [tmpAlert initWithTitle:@"Success"        <<<<Object released
                        message:@"entry saved" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    } else {
        // Show a save error dialog
        [tmpAlert initWithTitle:@"Error" 
                        message:@"entry not saved" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] ;
    }
    [tmpAlert show];                               <<<<Reference counted object is used after its released
    [tmpAlert release];
}

спасибо

1 Ответ

4 голосов
/ 14 июля 2010

Вы никогда не должны отделять alloc и init.init часто меняет объект за кулисами!Попробуйте

NSString* foo=[NSString alloc]; 
NSLog(@"%p %@", foo, [foo class]);
foo=[foo initWithString:@"bar"]; 
NSLog(@"%p %@", foo, [foo class]);

Вы увидите что-то вроде

2010-07-14 01:00:55.359 a.out[17862:903] 0x10010d080 NSPlaceholderString
2010-07-14 01:00:55.363 a.out[17862:903] 0x100001070 NSCFString

Это показывает, что +[NSString alloc] на самом деле ничего не выделяет;скорее то, что делает работа, это initWithString сама.Я не думаю, что UIAlertView делает это, но вы никогда не знаете.

Подводя итог: никогда не разъединяйте alloc и init.Я думаю, что статический анализатор просто предполагает, что все используют [[... alloc] init], так что он запутался в вашем коде.Анализатор должен был предупредить вас не разъединять alloc и init.

...