加载图像缩略图的问题

时间:2010-02-25 17:55:51

标签: iphone objective-c uitableview

我为包含从网址提取的图片缩略图的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?或者这只是灾难的一个方法?感谢您的任何意见/帮助。

1 个答案:

答案 0 :(得分:0)

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