内存管理和performSelectorInBackground:

law*_*nce 12 iphone cocoa-touch objective-c

哪个是对的?这个:

NSArray* foo = [[NSArray alloc] initWithObjects:@"a", @"b", nil];
[bar performSelectorInBackground:@selector(baz:) withObject:foo];

- (void)baz:(NSArray*)foo {
    ...
    [foo release];
}
Run Code Online (Sandbox Code Playgroud)

要么:

NSArray* foo = [[[NSArray alloc] initWithObjects:@"a", @"b", nil] autorelease];
[bar performSelectorInBackground:@selector(baz:) withObject:foo];

- (void)baz:(NSArray*)foo {
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    ...
    [pool release];
}
Run Code Online (Sandbox Code Playgroud)

我知道第一个有效,但Clang抱怨它,所以我想知道是否有更好的模式可供使用.

我会"尝试"第二个,但是通过自动释放,谁知道缺少EXC_BAD_ACCESS意味着你做得对,或者你刚刚幸运...

Tee*_*ppa 24

首先是错的.

performSelectorInBackground:withObject:保留bar和foo,直到执行任务.因此,您应该在创建它时自动释放foo并让performSelectorInBackground:withObject处理其余的事情.见文档

后者是正确的,因为你在创建时自动释放foo.您在baz中创建的自动释放池与foo的内存管理的正确性无关.需要对自动释放对象的自动释放池池分配和释放巴兹,不接触Foo的保留计数的.

  • 我应该澄清一下:你必须在-baz:中创建并释放一个自动释放池,除非你知道在那里什么也不会发送-autorelease方法.最好的经验法则是假设将发生并创建/排出自动释放池,如示例2所示.但是使用[池排水],而不是[池释放]. (4认同)