现在一直在寻找解决这个问题的方法。问题很简单。笔尖中有一个UIImageView
,我正在从互联网上加载图像并将UIIImageView
设置为图像。我正在发布viewController。 Dealloc实际上被调用(!)并再次加载viewController和图像。这可以通过非常简单地进入后台模式来完成。仪器泄漏不报告任何泄漏,但它在分配中显示它将图像保留在内存中并且它不断增长。
基本示例:
-(id)init {
if((self = [super init])) {
id path = [NSString stringWithFormat:@"http://www.aSite.com/largeImage.jpg"];
NSData* urlData = [[NSData alloc] initWithContentsOfURL:url];
UIImage* img = [[UIImage alloc] initWithData:urlData];
[background setImage:img];
[urlData release];
[img release];
}
return self;
}
-(void)dealloc {
[background release];
[super dealloc];
}
有人说UIImageView实际上是泄密,实际上是CGImage。有人说仪器没有正确显示。在使用2.5mb大图像进行10-15次后,我得到了内存警告。结果来自真实设备和最新iOS(或至少4-5周前)。由于UIImageView被很多人使用,我认为很容易找到问题或者从苹果那里得到修复?
CGImage泄漏的来源: (iphone) UIImageView setImage: leaks?
编辑:我写这个例子的时候我是abit tierd。示例现在是正确的。我也试过自动释放的对象,同样“泄漏”仍然存在。如果你要写一个答案,请回答问题。
答案 0 :(得分:2)
release
设置图片后的网址
[background setImage:[UIImage imageWithData:urlData]];
[urlData release];
[img release];
答案 1 :(得分:1)
在以下代码中,您犯了一些错误。
[urlData release];
[background setImage:[UIImage imageWithData:urlData]];
你应该使用
if((self = [super init])) {
id path = [NSString stringWithFormat:@"http://www.aSite.com/largeImage.jpg"];
NSData* urlData = [[NSData alloc] initWithContentsOfURL:url];
UIImage* img = [[UIImage alloc] initWithData:urlData];
[background setImage:img];
[urlData release];
[img release];
}
答案 2 :(得分:0)
你不能替换
[background setImage:[UIImage imageWithData:urlData]];
带
[background setImage:img];
<强>更新强>
我认为这也应该有所帮助
if((self = [super init])) {
id path = [NSString stringWithFormat:@"http://www.aSite.com/largeImage.jpg"];
NSData* urlData = [[NSData alloc] initWithContentsOfURL:url];
[background setImage:[UIImage imageWithData:urlData]];
[urlData release];
}
答案 3 :(得分:0)
你试过了吗?
-(id)init {
if((self = [super init]))
{
[background setImage:
[UIImage imageWithData:
[NSData dataWithUrl:
[NSUrl urlWithString:
@"http://www.aSite.com/largeImage.jpg" ]]]
];
}
return self;
}
-(void)dealloc {
[super dealloc];
}
干净且没有内存泄漏!