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的保留计数的.
| 归档时间: |
|
| 查看次数: |
22602 次 |
| 最近记录: |