gpt4 book ai didi

objective-c - 引用计数的不那么明显的减少

转载 作者:行者123 更新时间:2023-12-02 07:44:34 25 4
gpt4 key购买 nike

Xcode Analyze 提示我错误地减少了标记为“this line”的行的引用计数。这似乎有点奇怪,因为该行递减引用计数并不明显。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
UIImage * image = [[UIImage alloc] initWithData:receivedData];
if (image == nil) {
image = [UIImage imageNamed:@"null.bmp"];
}
self.itemImage.image = image; //this line
self.promotion.image = image;
[image release];
}

最佳答案

这是一件有点棘手的事情;造成困惑是可以理解的。此处的两条路径导致 image 持有具有不同所有权状态的对象,因此具有不同的引用计数。

遍历 if 会导致 image 持有您的代码不拥有的对象。

UIImage * image = [[UIImage alloc] initWithData:receivedData];
// If |initWithData:| succeeds, the object in |image| is owned, because you
// called |alloc| to create it.
if (image == nil) {
image = [UIImage imageNamed:@"null.bmp"];
// This object is _not_ owned by your code and you must not send
// |release| to it.
}
// ... the setter lines are irrelevant to the reference count of |image|.

[image release];
// This is only okay if |initWithData:| succeeded and you have ownership
// of |image|.

我认为分析器指示错误的行,就像编译器会在五行后提示缺少分号一样。

解决这个问题的方法可能是保留从 imageNamed: 获得的图像。你不能只是不发送 release,因为在一种情况下,您确实拥有image,并且您需要适本地放弃该所有权。我还建议在其中添加有关发送 retain 的评论,以便您在八个月后记住您这样做的原因。

比这更好的是,正如无与伦比的 Bavarious 在下面所建议的,而且我想你自己已经想到了,将自动释放 alloc 的图像并删除后来的 release 行。

关于objective-c - 引用计数的不那么明显的减少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7897153/

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