1

所以我有我在一个开源项目上看到的这种方法,它只是让我难以置信,为什么当我尝试运行静态分析器时它不会泄漏内存。我认为它应该泄漏的原因是因为它正在分配内存但从不释放它。每次调用该方法时它都会释放它(因为 =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;
}
4

2 回答 2

5

分析器识别static存储限定符,并理解它不会超出范围(当然,直到终止)。

每次调用该方法时它都会释放它(因为 =nil)。

不是这样。第一次调用该方法时会发生这种情况——只有一次,因为它是static

于 2012-04-20T17:46:16.047 回答
2

分析器没有抱怨,因为 exp 是静态的。尝试在没有静态的情况下再次分析,您会收到投诉。(我刚刚在 Xcode 中验证了这一点——关闭了 ARC。)

想想什么是静电,你就会明白为什么没有抱怨。你告诉编译器这个变量会一直指向对象。如果没有任何东西指向对象并且没有释放内存的机会,这只是一个泄漏。

于 2012-04-20T17:47:26.003 回答