past the lifetime of its owning ALAssetsLibrary
移転しました →
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]; // 略 }