gpt4 book ai didi

iphone - UIImage imageNamed 未正确自动释放

转载 作者:搜寻专家 更新时间:2023-10-30 19:50:49 24 4
gpt4 key购买 nike

出于某种原因,以下代码中的保留/释放行为让我完全困惑。

selectedImage = [UIImage imageNamed:@"icon_72.png"];
[selectedImage release];

应该中断但不会。为什么?我认为 imageNamed 会自行自动释放,这意味着此处的释放是多余的,并且在自动释放发生时应该中断。

以下是 .h 和 .m 文件中与 selectedImage 相关的片段:

@property (nonatomic, readonly) UIImage *selectedImage;
@synthesize delegate, selectedImage, spacerBottom, currentIndex;

其他注意事项,这确实中断了:

selectedImage = [UIImage imageNamed:@"icon_72.png"];
[selectedImage release];
[selectedImage release];
//objc[55541]: FREED(id): message release sent to freed object=0x59245b0
//Program received signal: “EXC_BAD_INSTRUCTION”.

正如这样:

selectedImage = [UIImage imageNamed:@"icon_72.png"];
[selectedImage release];
[selectedImage autorelease];
//objc[55403]: FREED(id): message autorelease sent to freed object=0x59b54c0
//Program received signal: “EXC_BAD_INSTRUCTION”.

以下也是如此:

selectedImage = [UIImage imageNamed:@"icon_72.png"];
[selectedImage autorelease];
[selectedImage release];
//objc[55264]: FREED(id): message release sent to freed object=0x592c9a0
//Program received signal: “EXC_BAD_INSTRUCTION”.

这样做也是如此:

selectedImage = [UIImage imageNamed:@"icon_72.png"];
[selectedImage autorelease];
[selectedImage autorelease];
//objc[55635]: FREED(id): message release sent to freed object=0x5b305d0
//Program received signal: “EXC_BAD_INSTRUCTION”.

最佳答案

-imageNamed:返回一个自动释放的图像,正如 deanWombourne 所说,它将在未来某个时间自动释放(具体时间未定义)。

它没有像您习惯的那样早自动释放的原因是 -imageNamed 还缓存了它返回的图像。缓存正在保留图像。

所以本质上,保留周期是这样的:

  • -imageNamed:被调用,
    • 系统分配并初始化图像 -- 保留计数 = 1;
    • 系统缓存图片 -- retain count = 2;
    • 系统自动释放图像并返回给你 -- retain count = 1; (理论上,该图像的保留计数仍为 2,因为自动释放池尚未释放它)。
  • 您在图像上调用 release -- 保留计数应为 0,并且应释放该对象。
  • 在未来的某个时刻(在运行循环结束时),自动释放池应该释放图像,并且会因为你过度释放它而崩溃。

如果您不释放它,缓存将继续保留图像直到它释放它,例如当内存警告发生时。因此,当您使用 imageNamed 获取图像时,它不会被释放,直到缓存被清除。

希望这能解决问题。

关于iphone - UIImage imageNamed 未正确自动释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2930204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com