iOS 8 では、写真を削除しても30日以内であれば元に戻すことができる機能 (Recently Deleted アルバム) が追加されました。
この機能の影響なのか、iOS 8 beta では ALAssetsGroup の numberOfAssets が正しい数を返してくれないバグ(?)が発生しています。
iOS シミュレータに最初から入っている5枚の写真のうち1枚を削除して下のコードを実行すると確認できます。
@import AssetsLibrary; ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init]; [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) { if (group) { NSLog(@"numberOfAssets: %ld", group.numberOfAssets); } } failureBlock:nil];
numberOfAssets: 5
写真を1枚削除したのに numberOfAssets は 5 を返しています (本当は 4)。
しかし enumerate してみると asset はちゃんと 4 つにあることになっています。
[group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) { if (result) { NSLog(@"result: %@", result); } }];
result: ALAsset - Type:Photo, URLs:assets-library://... result: ALAsset - Type:Photo, URLs:assets-library://... result: ALAsset - Type:Photo, URLs:assets-library://... result: ALAsset - Type:Photo, URLs:assets-library://...
ImagePicker を自作していたりすると、これが原因で NSRangeException が起こる可能性があります。
対処法としては、ALAssetsGroup の numberOfAssets を使わずに自分で enumerate してカウントするしかなさそうです。