嗨,我一直试图在我的应用程序中追踪一个非常难以捉摸的内存泄漏。
为了找出原因,我削减了泄漏代码,甚至将其移至应用程序委托以进行测试,以尝试消除尽可能多的因素。
以下代码是从使用选项完成启动时调用的。
- (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) {
}];
}
在我的应用程序中,这段代码泄漏了大约 2000 个 CGImage,枚举了照片流中的 1000 张照片。创建的所有 2000 个 UIImage 都可以正常发布。
如果我出于测试目的创建一个新的空项目并将相同的代码放在应用程序委托中并以完全相同的方式调用它,它不会泄漏。所有的 CGimage 都被释放,所有的 UIImage 又被释放了大约 2000 个实例。
这两个项目都在使用 ARC。
为什么以完全相同的方式调用的相同代码在两个项目之间表现不同?