+ (nullable uiimage *)imagenamed:(nsstring *)name;
+ (nullable uiimage *)imagewithcontentsoffile:(nsstring *)path;
這個程式一共載入了三組序列幀動畫:
首先我們使用+ (nullable uiimage *)imagenamed:(nsstring *)name;來載入
當我們把程式執行起來的時候,看下程式記憶體:
當我點選第一組的時候,看下記憶體
那麼我們接下來分析記憶體是為什麼增長到這麼多,而且當程式執行的時候一直不會釋放掉
當執行self.imageview.animationimages = nmarray;就會對陣列進行強引用,從而陣列裡面的內容不會被釋放。所以就會一直在記憶體中不會被釋放掉。
當時當我點選另外一組序列幀的時候,這個陣列會指向另外一組,那麼以前指向的應該就會被釋放掉了。如果是這樣的話,記憶體不會持續增漲,而是當前陣列
指向的一組的記憶體大小而已。實際現象是這個記憶體是一直增漲的,所以當animationimages這個指標指向別的陣列時,它以前指向的陣列並沒有在記憶體中釋放,
而是放到了快取區中。才會造成記憶體一直增漲,不會被釋放。很顯然,我們希望陣列指向另外乙個陣列的時候,要把以前指向的陣列釋放掉,從而釋放記憶體。
這裡就涉及到兩種載入的方法的區別了。接下來我們來看一下用+ (nullable uiimage *)imagewithcontentsoffile:(nsstring *)path;這種方式來載入,
再次看一下記憶體效果
只是換了一種載入方式,別的**沒有做任何改動。接下來看一下記憶體
同樣當我點選第一組序列幀的時候,
當我點第二組序列幀動畫時:
這兩種載入的方法的區別 ,在記憶體方面 ,看起來就顯而易見了。
那麼這兩種載入的方式到底存在著怎麼樣的區別呢。上面我們說了,當使用+ (nullable uiimage *)imagenamed:(nsstring *)name這種方式載入時,當
沒有指標指向的時候,並不會被釋放掉,而是放在了快取區中,所以記憶體就會一直增加。而使用+ (nullable uiimage *)imagewithcontentsoffile:(nsstring *)path
這種方式載入的時候,當沒有指標指向的時候,就會被釋放掉。所以記憶體就不會一直增加。
那麼,這兩種載入的方法,要看不同的情景。當會被多次使用的時候,並且比較小的時候,我們就使用+ (nullable uiimage *)imagenamed:(nsstring *)name
這種方式載入,因為被快取的快取區的時候,下一次再使用該的時候,載入的效率就會提高了。當不經常使用,並且比較大的時候,就使用+ (nullable uiimage *)imagewithcontentsoffile:(nsstring *)path這種方式載入,當使用完畢,直接釋放掉。因為基本不會被重複使用,使用者很少對一組序列幀**看好幾次吧。
通過記憶體的對比,這兩種載入的區別就顯而易見了。
一直有強指標指向。
這樣,對於序列幀動畫的記憶體問題就已經全部解決了。
當不經常使用的時候,就使用imagewithcontentoffile來載入,使用結束以後,直接釋放掉,沒有必要再繼續佔記憶體了。比如 序列幀動畫
頁面載入JS兩種方式
第一種 window.onload function 第二種 document ready function 或簡寫 function 區別 1.執行時間 window.onload必須等到頁面內包括的所有元素載入完畢後才能執行。document ready 是dom結構繪製完畢後就執行,不必等到載...
linux linux驅動載入的兩種方式
動態載入 在系統啟動後,通過insmod或modprobe命令載入.ko核心目標檔案,成功後可通過mknod指令進行掛載節點,不需要的時候可通過rmmod命令來解除安裝模組。優點 1 生成的核心檔案小 2 系統啟動時間短。3 使用靈活。缺點 每次使用都需要通過命令進行載入與解除安裝,操作麻煩。靜態載...
載入xib檔案的兩種方式
一 載入xib檔案的兩種方式 1.方法一 newscell是xib檔案的名稱 nsarray objects nsbundle mainbundle loadnibnamed newscell owner nil options nil 2.方法二 uinib nib uinib nibwithni...