不了解记忆分析

时间:2010-07-14 04:52:46

标签: iphone objective-c xcode memory-management clang-static-analyzer

我已将我的XCode升级到版本3.2.3以支持我的iphone项目上的iOS4。使用静态分析器我检查了内存管理问题。

在我的一个例程中,我遇到以下问题: 我在向日历添加事件后生成用户提醒,以便为其提供状态。

运行正常,但内存分析器不喜欢我定义警报的方式。 我看不到编码问题,是吗? (我指出内存分析器提示“<<<<<<<”)

- (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 个答案:

答案 0 :(得分:4)

您永远不应将allocinit分开。 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这样做,但你永远不知道。

回顾一下:永远不要将allocinit分开。我认为静态分析器只是假设每个人都使用[[... alloc] init],所以它被你的代码搞糊涂了。分析仪应警告您不要将allocinit分开。