こんにちは、アプリケーションで非常にとらえどころのないメモリ リークを突き止めようとしています。
原因を特定するために、リークしているコードを削除し、テスト目的でアプリ デリゲートに移動して、できるだけ多くの要因を排除しようとしました。
次のコードは、オプションを指定して起動を終了したことから呼び出されます。
- (void)loadDataAsTest {
NSLog(@"%s ", __PRETTY_FUNCTION__);
_library = [[ALAssetsLibrary alloc] init];
[_library enumerateGroupsWithTypes:ALAssetsGroupPhotoStream usingBlock:^(ALAssetsGroup *alAssetsGroup, BOOL *stop) {
@autoreleasepool {
if (alAssetsGroup) {
[alAssetsGroup enumerateAssetsUsingBlock:^(ALAsset *alAsset, NSUInteger index, BOOL *st) {
@autoreleasepool {
if (alAsset) {
NSLog(@"index = %u", index);
UIImage *image = [UIImage imageWithCGImage:[alAsset thumbnail]];
}
else {
}
}
}];
}
}
} failureBlock:^(NSError *error) {
}];
}
私のアプリケーションでは、このコードは、フォト ストリーム内の 1000 枚以上の写真を列挙する約 2000 枚の CGImage をリークします。作成された 2000 個の UIImage はすべて問題なくリリースされています。
テスト目的で新しい空のプロジェクトを作成し、アプリのデリゲートに同じコードを入れて、まったく同じ方法で呼び出すと、リークしません。すべての CGimage が解放され、すべての UIImage がそれぞれ約 2000 インスタンスずつ解放されます。
どちらのプロジェクトも ARC を使用しています。
まったく同じ方法で呼び出された同じコードが、2 つのプロジェクト間で異なる動作をするのはなぜですか?