- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我仅在主线程 iref
上执行以下操作时立即自动释放:
-(void)loadImage:(ALAsset*)asset{
@autoreleasepool {
ALAssetRepresentation* rep = [asset defaultRepresentation];
CGImageRef iref = [rep fullScreenImage];
UIImage* image = [UIImage imageWithCGImage:iref
scale:[rep scale]
orientation:UIImageOrientationUp];
[self.imageView setImage:image];
}
}
iref
不会像第一个示例那样立即释放。大约一分钟后:
-(void)loadImage:(ALAsset*)asset{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
@autoreleasepool {
ALAssetRepresentation* rep = [asset defaultRepresentation];
CGImageRef iref = [rep fullScreenImage];
UIImage* image = [UIImage imageWithCGImage:iref
scale:[rep scale]
orientation:UIImageOrientationUp];
dispatch_async(dispatch_get_main_queue(), ^(void) {
[self.imageView setImage:image];
});
}
});
}
CGImageRef
对象立即释放?
CGImageRef
对象被分配并且在它应该被释放后仍然存在大约一分钟。 CGImageRef
对象使用 CGImageRelease
当图像尝试自动释放时,我在一分钟后收到 BAD_EXEC 异常。 iref
使用 CGImageRetain
然后使用 CGImageRelease
释放它不起作用。 最佳答案
首先,没有“自动释放”CF 对象的概念。在处理免费桥接类(class)时,您可能会遇到这种情况,但正如您所见,有一个 CFRetain
和 CFRelease
但没有CFAutorelease
.所以我认为你误解了 iref
的所有权。 .让我们在整个代码中跟踪所有权:
-(void)loadImage:(ALAsset*)asset{
asset
被传递到这个方法中。假定其保留计数至少为 1。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
asset
上保留。 .
@autoreleasepool {
ALAssetRepresentation* rep = [asset defaultRepresentation];
CGImageRef iref = [rep fullScreenImage];
rep
正在返回一个指向
CGImageRef
的内部指针归
rep
所有.你也不拥有它,也不应该保留它。相关地,您无法控制它何时会消失。一个合理的猜测是它的生命周期会和
rep
一样长。一个合理的猜测是
rep
将活到
asset
所以你可能应该假设
iref
至少会活到
asset
.
UIImage* image = [UIImage imageWithCGImage:iref
scale:[rep scale]
orientation:UIImageOrientationUp];
dispatch_async(dispatch_get_main_queue(), ^(void) {
image
上。 (和
self
)。该 block 将由 libdispatch 复制,以延长这些保留的生命周期,直到该 block 被执行并自行释放。
[self.imageView setImage:image];
image
如果需要,为了完成它的工作。
});
self
上的 block 关闭所占用的保留。和
image
.
}
});
asset
上的 block 关闭所占用的保留。 .
}
iref
中 CGImageRef 的生命周期。因为它从不拥有它的所有权。这里的含义是 CGImageRef 由
asset
传递拥有。 , 所以它的生命周期至少和
asset
一样长.由于
asset
由于在外部 block 中使用而被保留(即由外部 block 的闭包保留),并且由于 libdispatch 没有 promise 何时释放已完成的 block ,因此您实际上无法保证
iref
将在 libdispatch 处理它之前消失。
-(void)loadImage:(ALAsset*)asset{
__block ALAsset* weakAsset = [asset retain]; // asset +1
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
@autoreleasepool {
ALAssetRepresentation* rep = [weakAsset defaultRepresentation];
CGImageRef iref = [rep fullScreenImage];
UIImage* image = [[UIImage alloc] imageWithCGImage:iref
scale:[rep scale]
orientation:UIImageOrientationUp];
__block UIImage* weakImage = [image retain]; // image +1
[weakAsset release]; // asset -1
dispatch_async(dispatch_get_main_queue(), ^(void) {
[self.imageView setImage: weakImage];
[weakImage release]; // image -1
});
}
});
}
__block
防止 block 关闭保留
asset
和
image
允许您自己明确地保留/释放它们。这意味着在您创建的所有事物中,所有事物都将被显式处置。 (
rep
和
image
可能是保留/自动释放,但你的池应该处理这些。)我相信这是你可以最明确的,因为
asset
被传递给您,因此您无法控制它的生命周期,它最终是存储在
iref
中的 CGImageRef 的“所有者”(就这个范围而言) .
关于ios - imageWithCGImage : GCD memory issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19540713/
所以这就是要点我有一个程序,它有一个由许多小图像组成的大图像,它获取该图像并将其分成许多较小的图像(如电影的帧),然后用户可以去擦洗通过。 我目前使用的是这种方法 - (NSMutableArray
我想将 Assets 中的所有照片保存到某个文件夹中。通过以下方式循环执行此操作: ALAssetRepresentation *representation = [asset defaultRepr
当我仅在主线程 iref 上执行以下操作时立即自动释放: -(void)loadImage:(ALAsset*)asset{ @autoreleasepool { ALAsse
我正在尝试在核心图中创建一个带有渐变的条形图。我有以下代码: UIImage *img = [UIImage imageNamed:@"orange_bar_graph"]; CPTImage *im
我正在使用位桶生成 UIImages,动态创建它们并交换 UIImageView 的图像。有没有办法直接编辑UIImageView的图像? (即,更改特定像素的颜色,而不从 UIImageView 中
我为 4.x 构建了一个应用程序,应该为所有 iPhone 3.0-4.x 部署。我意识到 imageWithCGImage:scale:orientation 方法仅在 4.0 及更高版本中可用。
由于我需要沿着 iPad 的所有 4 个侧面放置图像,我假设我可以使用其中一种方法将图像的方向相对于相应的侧面“向上”。 我对 iOS 比较陌生,但我通读了 Apple 文档。因为 Apple 文档似
我是一名优秀的程序员,十分优秀!