为什么这个NSMutableSet没有泄漏内存

时间:2012-04-20 17:41:01

标签: iphone objective-c ios ipad memory-management

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

2 个答案:

答案 0 :(得分:5)

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

  

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

不是这样。这是第一次调用该方法时发生 - 只有一次,因为它是static

答案 1 :(得分:2)

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

想想静电是什么,你可以看到为什么没有抱怨。你告诉编译器这个变量将保持指向对象。如果没有任何东西指向对象,并且没有机会释放内存,那只是泄漏。