所以我在开源项目中看到了这种方法,当我尝试运行静态分析器时,为什么这不会泄漏内存让我难以理解。我认为它应该泄漏的原因是因为它分配内存但从未释放它。每次调用方法时它都会释放它(因为= nil)。任何人都可以为我照亮吗?
- (BOOL)isValid(NSString *)name
{
// Using a set so access is faster
static NSMutableSet *exp = nil;
// Setup the set once with AB testing info
if (exp == nil) {
exp = [[NSMutableSet alloc] initWithCapacity:5];
}
if (exp != nil) {
return YES;
}
return NO;
}
答案 0 :(得分:5)
分析器识别static
存储限定符,并理解它不会超出范围(当然,直到终止)。
每次调用方法时都会释放它(因为= nil)。
不是这样。这是第一次调用该方法时发生 - 只有一次,因为它是static
。
答案 1 :(得分:2)
分析器没有抱怨,因为exp是静态的。尝试再次分析没有静态,你会得到投诉。 (我刚刚在Xcode中验证了这一点 - 关闭了ARC。)
想想静电是什么,你可以看到为什么没有抱怨。你告诉编译器这个变量将保持指向对象。如果没有任何东西指向对象,并且没有机会释放内存,那只是泄漏。