您好我一直试图在我的应用程序中追踪一个非常难以捉摸的内存泄漏。
为了隔离原因,我已经减少了泄漏的代码,甚至将其移动到应用程序委托进行测试,以尽量消除尽可能多的因素。
从带有选项的did finish启动调用以下代码。
- (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个UIImages都可以正常发布。
如果我为测试目的创建一个新的空项目,并将相同的代码放在app委托中,并以完全相同的方式调用它,它不会泄漏。所有CGimage都被释放,所有UIImage再次发布,每个都有2000个实例。
两个项目都在使用ARC。
为什么在两个项目之间以完全相同的方式调用相同的代码会有不同的行为?