0

ALAssetまたはアプリにあるその他のアセットタイプに関する基本情報をカプセル化するために使用するAssetInfoオブジェクトがあります。

アセット情報は、[alAssetサムネイル]をCGImageRefとして保持します。機器をチェックインしているとき、必要な数の2倍のCGImageオブジェクトがあるように見えます。4000個のAssetInfoインスタンスがあるとすると、約8000個のCGImageインスタンスがあります。

以下のようにAssetInfoオブジェクトをインスタンス化しています。

- (void)enumerateAsset:(AssetsGroupInfo *)assetsGroup alAsset:(ALAsset *)alAsset withIndex:(NSUInteger)index {

        NSDate *date = [alAsset valueForProperty:ALAssetPropertyDate];
        NSString *dateKey = [date dateKey];
        CGImageRef thumbnail = [alAsset thumbnail];
        NSURL *url = [[alAsset defaultRepresentation] url];

        AssetInfo *alAssetInfo = [[AssetInfo alloc]
                initWithURL:url
                   withDate:date
              withThumbnail:thumbnail];

        //...
}

私のAssetInfoクラスは次のようになります

@implementation AssetInfo {
        @private
            NSDate *_dateCreated;
            NSURL *_url;
            CGImageRef _thumbnail;
        }

        - (id)initWithURL:(NSURL *)url withDate:(NSDate *)date withThumbnail:(CGImageRef)thumbnailRef {

            if ((self = [self init])) {
                _url = url;
                _dateCreated = date;
                _thumbnail = CGImageRetain(thumbnailRef);
            }

            return self;
        }

        - (NSURL *)url {
            return _url;
        }

        - (NSDate *)dateCreated {
            return _dateCreated;
        }

        - (CGImageRef)thumbnail {
            return _thumbnail;
        }

        #pragma mark - Equality


        - (BOOL)isEqual:(id)object {

            //TODO:Include date in equality checking
            BOOL valueToReturn = NO;

            if (object && [object respondsToSelector:@selector(url)]) {
                NSURL *myUrl = [self url];
                NSURL *objURL = [object url];
                valueToReturn =  ([myUrl isEqualToURL:objURL]);
            }

            return valueToReturn;
        }

        - (NSUInteger)hash {
            return [[self url] hash];

        }

        - (void)dealloc {

            NSLog(@"%s", __PRETTY_FUNCTION__);

            CGImageRelease(_thumbnail);
        }
    @end

後で、以下のコードに示すようにアセットを使用します。

- (void)loadWithAsset:(AssetInfo *)asset {
    _asset = asset;
    _image = [[UIImage alloc] initWithCGImage:[_asset thumbnail]];
}

AssetInfoをインスタンス化するポイントでサムネイルをリリースすると(以下のsnnippetに示すように)、生きているCGImageオブジェクトの数は生きているAssetInfoオブジェクトの数に対応します。ただし、AssetInfoオブジェクトのthumbnailプロパティにアクセスしようとすると、CGImageRefを使用してUIImageをインスタンス化する上記のコードの行で、EXC_BAD_ACCESSを使用してアプリがクラッシュします。

 - (void)enumerateAsset:(AssetsGroupInfo *)assetsGroup alAsset:(ALAsset *)alAsset withIndex:(NSUInteger)index {

        NSDate *date = [alAsset valueForProperty:ALAssetPropertyDate];
        NSString *dateKey = [date dateKey];
        CGImageRef thumbnail = [alAsset thumbnail];
        NSURL *url = [[alAsset defaultRepresentation] url];

        AssetInfo *alAssetInfo = [[AssetInfo alloc]
                initWithURL:url
                   withDate:date
              withThumbnail:thumbnail];

        //...

      CGImageRelease(thumbnail);
}

私は何か間違ったことをしていますか?

4

1 に答える 1

0

確認はしていませんがUIImage initWithCGImage:、コピーしても驚かないでしょう。それはあなたの2倍を説明しませんか?Instrumentsで、生きているインスタンスのスタックトレース(右側の拡張詳細ペイン)を確認します。誰が作成したかがわかります。

于 2012-08-29T13:29:02.423 に答える