Just a Computer Graphics Studio & My Life

還在搞記憶體的問題,這個問題可是所有工程師的夢魘啊~程式之所以會crash,一大原因就是出於記憶體相關問題,而我最近面對的是記憶體無法釋放~

iOS UIImageView和UIButton的setImage

由於每當一個cell出現,就會重新setImage一次,若沒有適時釋放記憶體,很容易就會有memory warning,超出上限最後就會crash囉~

若image只是存放在專案裡還不會有問題,但image若是在網路上索取,就需要把它cache起來,經過測試之後,發現自己人寫的cache方法沒有問題,有問題的居然是Apple給的SDK,它UIbutton的setImage就是沒辦法釋放記憶體,導致滑沒幾下就開始lag,終將crash!

要不是我花時間去trace和debug,還會怪罪於沒用ARC機制(後來整個專案改成ARC機制,狀況也沒有因此改善),後來嘗試使用UIImageView的setImage取代,滑到我手酸都還沒有些微異樣耶!

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        NSData *data = [NSData cachedDataFromContentOfURL:imageURL];
        UIImage *image = [UIImage imageWithData:data];
        if (data) {
            dispatch_async(dispatch_get_main_queue(), ^{
                //                [cell.coverLeftButton setImage:[UIImage imageWithData:data] forState:UIControlStateNormal];
                [cell.coverLeftImageView setImage:image];
                [cell.coverLeftImageView setContentMode:UIViewContentModeScaleAspectFit];
            });
        }

    });
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        NSData *data = [NSData cachedDataFromContentOfURL:imageURL2];
        UIImage *image = [UIImage imageWithData:data];
        if (data) {
            dispatch_async(dispatch_get_main_queue(), ^{
                //                [cell.coverRightButton setImage:[UIImage imageWithData:data] forState:UIControlStateNormal];
                [cell.coverRightImageView setImage:image];
                [cell.coverRightImageView setContentMode:UIViewContentModeScaleAspectFit];
            });
        }
    });

寫成這樣子就沒有問題了~

本來以為同樣是setImage,功用不都一樣嗎?對~理論上應該要一樣才對,但實務上卻不一定阿~所以接案要特別留意時程安排,不要以理論上的時間去計劃,除非任何功能都有相當多的經驗,不然像我同時要開發新專案,還要維護舊專案,兩個案子撞在一起可不再是美麗的錯誤了~(其實還有一個舊專案要新增功能

要不是專案時程緊迫,我才不想耗費時間在這種問題上!不過我還是想花點時間記錄下來,如果你看到這篇文章,那麼恭喜你省了許多時間了:D

也許你會問我,如何用UIImageView取代UIButton?其實原本想用前者,但因為要能點選影像進入另一view,所以才會用後者。現在我前後者都用,只是setImage的部分交給前者,點選的部分就交給後者嚕~

廣告

Comments on: "[iOS] UIImageView和UIButton的setImage" (3)

  1. 專業路人甲 No. 1109 said:

    謝謝你的說明!

    按讚數

發表留言

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

標籤雲

%d 位部落客按了讚: