0

我有一个 AssetInfo 对象,用于封装有关 ALAsset 或我的应用程序中可能拥有的其他资产类型的基本信息。

资产信息将 [alAsset 缩略图] 保存为 CGImageRef。当我检查仪器时,我的 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 的位置释放缩略图(如下面的片段所示),则活动 CGImage 对象的数量对应于活动 AssetInfo 对象的数量。但是,当我尝试访问 AssetInfo 对象的 thumbnail 属性时,应用程序在上面代码中的行中出现 EXC_BAD_ACCESS 崩溃,在该行中我使用 CGImageRef 实例化了 UIImage。

 - (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 回答