ALAssetsLibary
で取得したALAssets*
のオブジェクトを使おうとするとこんなエラーメッセージが出ることがある。
invalid attempt to access <ALAssetPrivate: 0x16eb5630> past the lifetime of its owning ALAssetsLibrary
起動時にALAssetを読み込んでおき、あとで使うためにNSMutableArray
か何かで保持しておくとする。そのとき例えばこういうコードを書く。すると↑のようなエラーが出て写真などの情報を取ってこれないという事態になる。
- (void)loadAssets {
_assets = [NSMutableArray new];
ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
if(!group) return;
[group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
[self.assets addObject:result];
}];
} failureBlock:nil];
}
どうやらこのエラーは使おうとしているALAssets*
を返してくれたALAssetsLibrary
が既にいなくなっているというような意味合いらしい。先ほどのコードではALAssetsLibrary
がメソッドのローカルスコープにあり、そのスコープ外ではALAssets*
を使えないようだ。
ALAssetsLibrary
をプロパティとして持つことでこの問題は回避できる。
@interface ViewController()
@property (nonatomic, strong) ALAssetsLibrary *assetsLibrary;
@end
- (void)loadAssets {
_assets = [NSMutableArray new];
_assetsLibrary = [[ALAssetsLibrary alloc] init];
// 略
}