ARC是如何工做的


一.ARC是如何工做的 
你可能已經適應了手動管理內存的分配與回收。它的原理是這樣的:當你須要在內存中保持一個對象,那麼你須要retain它,除非它已經被自動retain了。當你再也不使用一個對象時,你須要release它,除非它已經被autorelease掉了。 
這種手動管理內存的方式雖然不難,可是很是容易出錯。不管是你屢次的release了某對象,仍是你的變量指向了一個不在存在的數據,或者是因爲你沒有release掉足夠多的對象致使內存耗盡,都會形成程序的crash 
雖然靜態分析工具staticanalyze在尋找錯誤方面有幫助,可是ARC作的更加出色。它經過在編譯階段,而不是程序運行時,在程序的適當位置添加retainrelease方法來幫你管理內存。 
二.strong指針保存了對象的生命 
ARC的新規則很是簡單,你須要作的只是將指針指向對象。只要還有strong類型的指針指向對象,這個對象就不會被釋放。當指向這個對象的指針指向了其餘對象或者被釋放,這個對象就會被釋放掉。這個規則對於實例變量,屬性,甚至是局部變量都是適用的。 
                               
firstNameself.textField.text都指向一樣的string對象。該string對象保存了用戶的一段文本輸入。 
 
當用戶改變了文本,則self.textField.text指向新的string對象「Rayman」。但firstName仍然指向以前的string對象「Ray」。因此string對象「Ray」依然有指針指向它,所以它不會被釋放。 
 
可是當firstName指向一個新的對象時,string對象「Ray」因爲沒有任何strong類型的指針指向它,它就被釋放掉了。 
三.Weak指針不能保持對象的生命 
 
weakName是指向string對象「Rayman」的weak指針。 
 
string對象「Rayman」沒有strong類型的指針指向它時,它被釋放掉。同時,指向它的weak指針weakName也會被設置爲nil 
Weak指針主要用於存在父子關係的兩個對象中,以免相互retain形成兩者都沒法被釋放的retain cycle出現。 
相關文章
相關標籤/搜索