如何释放从 ALAssetsLibrary 获取的 UIimage

Posted

技术标签:

【中文标题】如何释放从 ALAssetsLibrary 获取的 UIimage【英文标题】:How can I release UIimage which was fetched from ALAssetsLibrary 【发布时间】:2012-12-14 07:08:56 【问题描述】:

我花了整整 2 周的时间来解决这个问题。好郁闷!

以下 2 个函数是我用于从设备库中获取图像的函数。 如果我多次使用“setImage”函数,我的 ios 设备上的可用内存就会不断丢失。

我认为assetImage函数中的“[imageFromAsset initWithCGImage:[[myasset defaultRepresentation] fullScreenImage]];”会导致问题。

任何人都可以帮助我吗?任何线索或想法都会非常感激!请!

- (void)setImage:(NSURL *)imageURL
UIImage *imageFromDeviceLibrary = [[UIImage alloc] init];
[[DevicePhotoControl sharedInstance] assetImage:[imageURL absoluteString] imageToStore:imageFromDeviceLibrary];    
UIImageView *fullImageView = [[UIImageView alloc] initWithImage:imageFromDeviceLibrary];
[imageFromDeviceLibrary release];
[self.view addSubview:fullImageView];
[fullImageView release];


- (void)assetImage:(NSString *)assetURL imageToStore:(UIImage *)imageFromAsset
    // Handling exception case for when it doesn't have assets-library
if ([assetURL hasPrefix:@"assets-library:"] == NO) 
    assetURL = [NSString stringWithFormat:@"%@%@",@"assets-library:",assetURL];

__block BOOL busy = YES;

ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease];
//get image data by URL
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)

    [imageFromAsset initWithCGImage:[[myasset defaultRepresentation] fullScreenImage]];
    busy = NO;
;
ALAssetsLibraryAccessFailureBlock failureblock  = ^(NSError *myerror)

    NSLog(@"Library Image Fetching Failed : %@",[myerror localizedDescription]);
    busy = NO;
;
[assetslibrary assetForURL:[NSURL URLWithString:assetURL]
               resultBlock:resultblock
              failureBlock:failureblock];

while (busy == YES) 
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];


【问题讨论】:

【参考方案1】:

AssetLibrary 被释放的那一刻,所有的资产对象都将随之消失。

我建议您在应用程序委托中创建您的assetLibrary 以使其保持活动状态,并且仅在您从 ALAssetLibrary 收到更改通知 ALAssetsLibraryChangedNotification 时重置它

here

也许对你有帮助。

【讨论】:

非常感谢 Girish!好的,我现在就试试,让你知道! 我想知道何时触发 ALAssetsLibraryChangedNotification? 您需要添加通知以及删除通知。 我对我的“-(id)init”函数做了这个。我的意思是我在上面的函数中添加了通知观察者。但它没有被触发。 如果您使用的是 iOS 5,请点击我现在在答案中添加的链接。

以上是关于如何释放从 ALAssetsLibrary 获取的 UIimage的主要内容,如果未能解决你的问题,请参考以下文章

从 ALAssetsLibrary 获取所有照片

MonoTouch:从 ALAssetsLibrary.AssetForUrl 中获取图像

Objective-C/ALAssetslibrary - 从图像 exif 信息中获取 gps 纬度

ALAssetsLibrary 获取所有视频

如何根据目标c中的日期获取照片

ALAssetsLibrary 获取相机胶卷