我有一个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);
}
我做错了吗?
答案 0 :(得分:0)
我尚未验证,但如果UIImage initWithCGImage:
复制,我不会感到惊讶。那不是你的2倍吗?在Instruments中,查看生活实例的堆栈跟踪(右侧的扩展详细信息窗格)。它会告诉你是谁创造的。