2012-05-01 30 views
1

我新的Objective-C和我不知道如果我使用NSAutoreleasePool的正确途径。这是使用NSAutoreleasePool的正确方法吗?

  1. 如果我想使用自动释放唯一一次我用:

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSString *newText = [NSString stringWithFormat:@"%d", prograssAsInt]; 
    sliderLabel.text = newText; 
    [pool release]; //newText will be released 
    
  2. 如果我想使用自动释放几次我用:

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSString *newText = [NSString stringWithFormat:@"%d", prograssAsInt]; 
    sliderLabel.text = newText; 
    [pool drain]; //newText will be released 
    newText = [NSString stringWithFormat:@"%d", prograssAsInt]; 
    sliderLabel.text = newText; 
    [pool drain]; //newText will be released 
    newText = [NSString stringWithFormat:@"%d", prograssAsInt]; 
    sliderLabel.text = newText; 
    [pool release]; //newText will be released 
    

这是好?有没有内存泄漏?

回答

3

( 2)不好。 -drain-release是等价的(在参考计数环境),以及aftering -drain荷兰国际集团的自动释放池被解除分配。所以你将双释放autorelease池对象并使程序崩溃。

即使在ARC之前,除非您的内存预算非常紧张,否则除了样板main()之外,创建NSAutoreleasePool并不常见。 -autoreleaseÐ入池的对象将NSRunLoop的每一个滴答声后,反正被释放。如果严格遵守所有权转移规则,则不会发生内存泄漏(请参阅Understanding reference counting with Cocoa and Objective-C)。

而且 ARC打开,您甚至不需要关心这个 - 编译器将插入-retain-release在适合你的地方。


而且,如果sliderLabel.text被标记为@property(retain)(或(strong)),然后释放自动释放池(1)将不发布使用newText,因为这个对象现在有一个新的所有者。

3

我要说[pool drain]的调用是不必要的。我从来没有见过他们在实践中使用。我想如果你在autorelease池中分配大量的内存,它可能是必要的。但在典型的情况下,我想不会。

你将要开始使用下面的结构,顺便说一下,对于自动释放池:

@autoreleasepool { 
    ... your code ... 
} 

这,显然远远超过了“老”的方式(你正在做的方式高效)。在功能上,它是一样的,但内部表现要好得多。最近Xcode/iOS发行说明中提到了这个问题。

3

抱歉这样说,但RTFM。在调用-drain之后,池将自行释放,以使其无效。

而且,目前,在Objective-C与苹果的LLVM编译器,有一个名为@autoreleasepool语言此外,随着双方ARC和非ARC代码的工作,你可以利用这样:

@autoreleasepool { 
    // code that will automatically have any -autoreleased variables cleaned up. 
} 
+0

我觉得无礼是没有道理的。虽然这是记录在案,这是非常违反直觉的,到了那里我从有经验的程序员可可究竟是谁阅读文档,并没有认为它的意思是说,听到了点。我不认为对于刚接触这个框架的人来说这是一个不合理的问题。 – Chuck

3

通常情况下,如果你是在主线程和你不使用的资源密集型代码一个巨大的循环,你永远不要需要创建自己的自动释放池。只需使用为您创建的默认设置即可。

你只需要,如果你的多线程使自己或者如果你正在做一个内存密集型长期运行的循环(这你可能不应该在主线程上做反正)。

相关问题