0

我已将我的 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];
}

谢谢

4

1 回答 1

4

你永远不应该将alloc和解耦initinit经常改变幕后的对象!尝试

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],所以它被你的代码弄糊涂了。分析器应该警告您不要解耦allocinit.

于 2010-07-14T05:04:50.940 回答