2012-04-20 99 views
1

所以我有这个方法,我看到一个开源项目,它只是令我难以置信,当我尝试运行静态分析器时,这不会泄漏内存。我认为它应该泄漏的原因是因为它分配内存但从不释放它。它每次调用该方法时都会释放它(因为= nil)。任何人都可以为我散光吗?为什么不是这个NSMutableSet泄漏内存

- (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

你使用弧 – 2012-04-20 17:42:46

+0

不,这不是..我没有这个东道主尚未.. – adit 2012-04-20 17:44:12

+0

它是否抱怨,如果它不是一个静态?鉴于exp是静态的,你不希望它抱怨。你不会像保留静态对象那样泄漏太多东西。 – Obliquely 2012-04-20 17:44:35

回答

5

分析仪识别static存储预选赛,并理解它不出去的范围(直至终止,当然)。

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

并非如此。这是第一次调用该方法时发生的 - 只有一次,因为它是static

+0

但它实际上是否泄漏?问题是我应该在方法 – adit 2012-04-20 17:46:58

+0

nope的末尾释放它。我还添加了一些关于初始化的内容。在某种程度上,它永远不会被释放,直到终止。但这只是一个例子(假设当然没有竞争条件)。这实际上是全球数据如何工作的原因,并且分析器没有足够的信息来静态确定该对象可以根据其类型进行更早的解除分配。但是,这也会改变返回值,因此它的处理是恰当的。 – justin 2012-04-20 17:47:52

+0

嗯......它是如何静态NSMutableSet * exp = nil;被称为第一次?什么时候发布然后 – adit 2012-04-20 17:52:49

2

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

想想静态是什么,你可以看到为什么没有投诉。你正在告诉编译器这个变量将保持指向该对象。这只是一个漏洞,如果没有任何东西指向对象,并且没有释放内存的机会。

+0

,但只是看到上面的代码..它似乎泄漏,因为我正在分配,如果我不再次调用该函数,我不会释放它 – adit 2012-04-20 17:49:00

+1

你没有泄漏,因为exp仍然指向对象。该对象仍然在并指向。这是一个保留的对象,而不是泄露的。泄漏的对象是一个永远不会被释放的对象,因为你已经失去了它所在的位置。分配和不释放不一样泄漏。有时你想故意这样做,例如通过使用静态,比照。如何实施单身人士。 – Obliquely 2012-04-20 17:51:21

+0

好吧,我想你只是启发我,分配和不释放不是泄露。感谢那 – adit 2012-04-20 17:54:01