gpt4 book ai didi

objective-c - 内存管理和performSelectorInBackground :

转载 作者:太空狗 更新时间:2023-10-30 03:21:33 26 4
gpt4 key购买 nike

哪个是对的?这:

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

- (void)baz:(NSArray*)foo {
...
[foo release];
}

或者:

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];
}

我知道第一个有效,但 Clang 提示它,所以我想知道是否有更好的模式可以使用。

我会“尝试”第二个,但是对于自动释放,谁知道没有 EXC_BAD_ACCESS 意味着你做对了还是你运气好...

最佳答案

第一个是错误的。

performSelectorInBackground:withObject: 保留 bar 和 foo 直到任务被执行。因此,您应该在创建 foo 时自动释放 foo 并让 performSelectorInBackground:withObject 处理其余部分。参见 documentation

后者是正确的,因为您在创建 foo 时自动释放它。您在 baz 中创建的自动释放池与 foo 内存管理的正确性无关。 inside 池分配和 baz 中的释放需要自动释放池,它根本不涉及 foo 的保留计数。

关于objective-c - 内存管理和performSelectorInBackground :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/873200/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com