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的指定,它也会告诉我有关泄漏的信息。
这里有什么问题?
非常感谢....答案 0 :(得分:2)
我想这个问题是因为你错误地使用了点语法并且混淆了静态分析器。你永远不应该曾输入anObject.release
,因为那有完全错误的含义。 Dot语法被设计用于访问属性,并且具有该特定的语义含义,例如,访问一个属性。修改对象本身的任何东西都应该是一个方法,而不是一个属性,应该这样调用。
换句话说,将其更改为
[eB release];
[emailB release];
[space release];
事情应该运转正常。现在静态分析器应该认识到你确实在释放对象。
最后需要注意的是,eB.release
在技术上有效的事实可以被认为是编译器如何工作的工件。虽然我不相信会破坏,但我也不知道是否保证不会这样做,而且依赖它是非常糟糕的形式。