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}