iPhone Autoreleasepool和分配
-
26-09-2019 - |
题
我一直在阅读有关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];
}
您必须发送自动释放消息,以自动释放池里面的对象。当释放消息被发送到池,他们将被释放。