Điều gì là đúng? Đây:Quản lý bộ nhớ và thực hiệnSelectorInBackground:
NSArray* foo = [[NSArray alloc] initWithObjects:@"a", @"b", nil];
[bar performSelectorInBackground:@selector(baz:) withObject:foo];
- (void)baz:(NSArray*)foo {
...
[foo release];
}
Hoặc:
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];
}
Tôi biết người đầu tiên hoạt động, nhưng Clang phàn nàn về điều đó, vì vậy tôi tự hỏi, nếu có một mô hình tốt hơn để sử dụng.
tôi sẽ "chỉ thử" người thứ 2, nhưng với autoreleasing, ai mà biết được liệu sự vắng mặt của EXC_BAD_ACCESS
có nghĩa là bạn đang làm đúng hay mà bạn chỉ có may mắn ...
Ồ, nó phải có trong tài liệu! Tôi ngớ ngẩn quá. :) – lawrence
Tôi nên làm rõ: bạn PHẢI tạo và thoát một nhóm autorelease bên trong -baz :, trừ khi bạn BIẾT rằng không có gì sẽ được gửi một phương pháp -autorelease bên trong đó. Nguyên tắc tốt nhất là giả định rằng điều đó sẽ xảy ra và tạo/thoát một nhóm tự động phát hành, như trong ví dụ 2. Nhưng sử dụng [pool drain], không phải [release pool]. –
Chính xác như Jim Dovey đã nói: bạn thường cần tạo hồ bơi autorelease giống như bạn làm cho chức năng chính (xem Hướng dẫn lập trình chủ đề). Nó chỉ là quan trọng để hiểu rằng hồ bơi này không có gì để làm với autorelease của foo. –