我在仪器中的CGImage对象数量是我应有的两倍

时间:2012-08-29 11:42:09

标签: ios cgimage

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

资产信息将[alAsset thumbnail]保留为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的位置释放缩略图(如下面的snnippet所示),则活CGImage对象的数量对应于生命的AssetInfo对象的数量。但是,当我尝试访问AssetInfo对象的缩略图属性时,应用程序在上面代码中的行中使用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);
}

我做错了吗?

1 个答案:

答案 0 :(得分:0)

我尚未验证,但如果UIImage initWithCGImage:复制,我不会感到惊讶。那不是你的2倍吗?在Instruments中,查看生活实例的堆栈跟踪(右侧的扩展详细信息窗格)。它会告诉你是谁创造的。