【问题标题】:I have twice as many CGImage objects in instruments than I should have我在仪器中的 CGImage 对象数量是我应该拥有的两倍
【发布时间】:2012-08-29 11:42:08
【问题描述】:

我有一个 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 属性时,应用程序在上面的代码中使用 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);
}

我做错了吗?

【问题讨论】:

    标签: ios cgimage


    【解决方案1】:

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

    【讨论】:

    • 这一切都发生在我在任何 UIImage 中使用缩略图之前。我只是枚举 Assets 库中的资产并创建一个对象图来表示那里的所有资产。
    猜你喜欢
    • 2015-07-07
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    相关资源
    最近更新 更多