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