MRC 및 ARC에서 비동기 블록 내에 __block 객체를 쉽게 할당하고 유지할 수 있는지 궁금합니다. 최소한의 변경으로 코드를 다시 작성하면서 다음 코드를 얻었습니다. 비동기 블록에서 이미지를 반환하려고 할 때 막혔습니다. 문제는 코드가 언젠가 ARC로 변환된다는 것입니다. 난 변환 후 숨겨진 메모리 추락 사고 싶지 않아요. 내 옵션은 그런 일이 사제 객체 홀더, 배열이나 다른 사람을 사용 비동기 블록 외부 변수에 객체 할당
- 했다
- 직접 (내가 사용) 배열에 이미지 추가
- 다른 구성
배경 스레드 기본적 코드 부하 복수의 화상에 코드를 재 작성. // image deallocated :(
을 검색하면 위치가 표시됩니다.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
ALAssetsLibrary *assetsLibrary = nil;
for (int i = 0; i < sources.count; ++i) {
__block UIImage *image = nil;
id source = sources[i];
if ([source isKindOfClass:[NSString class]]) {
image = something
} else if ([source isKindOfClass:[NSURL class]]) {
NSURL *url = source;
if ([url.scheme isEqualToString:@"assets-library"]) {
dispatch_group_t group = dispatch_group_create();
if (!assetsLibrary)
assetsLibrary = [[[ALAssetsLibrary alloc] init] autorelease];
dispatch_group_enter(group);
[assetsLibrary assetForURL:url resultBlock:^(ALAsset *asset) {
image = something
dispatch_group_leave(group);
} failureBlock:^(NSError *error) {
dispatch_group_leave(group);
}];
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
// image deallocated :(
} else if (url.isFileURL) {
image = something
}
}
// add image to an array
}
dispatch_async(dispatch_get_main_queue(), ^{
// notify
});
});
루프 내부의 작업은 직렬입니다. 이미지 변수의 위치는 편집 후 잘못된 위치에 놓기 때문에 잘못되었습니다. 코드의 목적은 이미지를 메모리에로드하는 것입니다. – keithyip
@keithyip 최대 이미지 수는 몇 개입니까? –
@keithyip ** dispatch_group_t 그룹 = dispatch_group_create(); **를 for 루프 외부로 옮겨서는 안됩니까? –