2010-02-25 75 views
1

我为包含从网址中提取的图片缩略图的tableview编写了一些朴素的代码(就是说它是同步调用)。在的cellForRowAtIndexPath拉动图像的代码是这样的:加载图片缩略图时出现问题

data = (data == nil)? [[NSData alloc] initWithContentsOfURL:photoThumbPage] : [data initWithContentsOfURL:photoThumbPage]; 
thumbImg = (thumbImg == nil)? [[UIImage alloc] initWithData:data] : [thumbImg initWithData:data]; 

我认为有可能与不分配一个新的NSData和UIImage的每一次加速,所以我在类中定义它们。每次我得到一个缩略图,我想检查它们是否被定义,如果它们已经是,我只是用不同的值再次初始化它们。

因为我在这里写这个问题,你已经可以猜到各种不好的事情发生了:)当我滚动浏览我的tableview时,有时,两个或更多的条目将共享相同的图像,控制台不会崩溃我的应用程序,但告诉我,我的JPEG文件已损坏。

撇开这些请求中的每一个都应该是异步的,而且我真的应该缓存这些结果,任何人都可以告诉我我可能会在哪里绊倒?看起来,如果为每个可见的单元格调用cellForRowAtIndexPath,并且我的代码是同步的,那么nsdata和uiimage变量应该保留在调用中(它们被init方法消除)应该没有理由。我换出这些成员变量和每次初始化它们:

NSData *data_local = [[NSData alloc] initWithContentsOfURL:photoThumbPage]; 
UIImage *thumbImg_local = [[UIImage alloc] initWithData:data]; 

和它工作得很好。每次我想加载一个缩略图时,分配一个可重用的成员变量而不是分配一个新的NSData和UIImage有什么好处吗?或者这只是一场灾难?感谢您的任何意见/帮助。

回答

0

问题不是你正在重复使用成员变量,而是你正在重复使用内存中相同的空间。当您第二次调用init的数据时,您仍然使用与以前相同的内存空间(来自alloc方法的空间)。这会导致多个UIImage指向相同的内存区域,因此会创建多个图像,并在创建新图像时从每个UIImage下面更改底层数据,因此会生成有关错误JPEG的错误消息。

+0

谢谢!这很有意义。 – Ying 2010-02-25 18:15:49