我一直在阅读有关autoreleasepool,但有一点是一点我不清楚。我一直在使用,需要使用单独的autoreleasepool内存管理线程的一些功能。

在下面的例子中是正确的

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];

   NSString *myString = @"Hello";

   [pool release];
}

这是正确的吗?

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];

   NSString *myString = [[NSString alloc] initWithString:@"Hello"];

   [pool release];
}

或这

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];

   NSString *myString = [[NSString alloc] initWithString:@"Hello"];

   [myString release];
   [pool release];
}

我的问题是在拥有的自动释放池需要的范围内创建对象要明确relased或者是照顾时被释放autorelasepool的?

张志贤

有帮助吗?

解决方案

自动释放池句柄自动释放物体。如果你拥有一个对象(通过ALLOC或复制或保留),那么你必须将其释放。所以,你的第二个例子是不正确的。正如你所分配的字符串,你拥有它,你必须将其释放。

时,对于主线程创建的自动释放池。 (你可以看看的主要功能,如果你想)。每个线程需要自己的自动释放池来管理自动释放对象。这就是为什么,如果你创建另一个线程,那么你必须创建一个线程自动释放池。即使你没有在线程创建自动释放的对象,你应该建立本作中,该线程可能会产生自动释放对象库的调用。即使你确信没有库调用正在自动释放的对象,那么你也应该创建它们,因为这是最好的做法,特别是如果你是在其上开发和多人撑大项目。

其他提示

您只需要创建在您创建了一堆自己的自动释放池 自动释放的对象,你收集马上想垃圾。但是,你是正确的,你不想引用任何“自动释放”对象创建你释放池后。当池被排出自动释放对象(不保留)被破坏。

由于没有在实施例中的对象被自动释放,创建自己的自动释放池实质上是一个空操作。

的无论你的例子需要一个自动释放池。自动释放池仅采取自动释放对象的护理:

NSArray *foo = [NSArray array];
NSObject *bar = [[[NSObject alloc] init] autorelease];

您第一个字符串使用字符串常量初始化的,因此很可能是相对于内存管理(也许别人知道更多)特殊。你的第二个字符串泄漏,池并不会有所作为。你的第三个字符串被释放正确,再次池不会有所作为。

这是你需要一个池:

- (void) someMethodThatRunsOnAThread {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSString *foo = [@"foo" uppercaseString];
    [pool drain];
}

下面的foo字符串会如果池是不存在泄漏。请注意,我打电话drain而不是在泳池release - 在iOS上有没有差别,但在两个不同的垃圾回收的环境中,因此它可能是更好地调用合适的人的习惯,要获得

另外请注意,你可能需要一个游泳池,即使你没有任何自动释放自己的对象,有可能是你在你的方法调用的代码完成许多地方的内存操作。

认为这应该是这样的:

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];


   NSString *myString = [[[NSString alloc] initWithString:@"Hello"] autorelease];

   // or create string like this (automatically autoreleased)
   NSString *myString = [NSString stringWithString:@"Hello"];

   [pool release];
}

您必须发送自动释放消息,以自动释放池里面的对象。当释放消息被发送到池,他们将被释放。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top