XCode的构建和分析 - 错误或纠正潜在泄漏?

时间:2010-07-08 23:12:25

标签: xcode memory-leaks code-analysis

Xcode的“构建和分析”有多可靠?

我一直在寻找它找到的“潜在泄漏” - 但是不明白它。

这里是代码:

-(void)viewDidLoad{

    self.navigationItem.leftBarButtonItem = self.editButtonItem;

    UIBarButtonItem *aBI = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd
                                                                        target:self action:@selector(add:)];

    self.navigationItem.rightBarButtonItem = aBI;
    aBI.release;

    UIBarButtonItem *eB = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemOrganize
                                                                        target:self action:@selector(EinstellungenTapped:)];
    UIBarButtonItem * space = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];


    UIBarButtonItem *emailB = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCompose
                                                                       target:self action:@selector(emailTapped:)];


    NSArray* toolbarItems = [NSArray arrayWithObjects: eB,space,emailB,
                             nil];

    [self setToolbarItems: toolbarItems];

    eB.release;      // <------- Potential leak ??????
    emailB.release;  // <------- Potential leak ??????
    space.release;  // <------- Potential leak ??????
    }

为什么这三个应该是潜在的泄漏?

即使没有对NSARRAY的指定,它也会告诉我有关泄漏的信息。

这里有什么问题?

非常感谢....

1 个答案:

答案 0 :(得分:2)

我想这个问题是因为你错误地使用了点语法并且混淆了静态分析器。你永远不应该输入anObject.release,因为那有完全错误的含义。 Dot语法被设计用于访问属性,并且具有该特定的语义含义,例如,访问一个属性。修改对象本身的任何东西都应该是一个方法,而不是一个属性,应该这样调用。

换句话说,将其更改为

[eB release];
[emailB release];
[space release];

事情应该运转正常。现在静态分析器应该认识到你确实在释放对象。

最后需要注意的是,eB.release在技术上有效的事实可以被认为是编译器如何工作的工件。虽然我不相信会破坏,但我也不知道是否保证不会这样做,而且依赖它是非常糟糕的形式。