2010-02-25 45 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