2.內存管理之objective-c

1.爲什麼要管理內存

    

   系統資源有限,會爲每個程序分配30M的內存,超過20M會收到內存警告,超過30Msorry系統將會終止你的應用程序。

   

   1)內存管理機制

    

            ObjC中提供了一個機制來實現上面提到的這個邏輯模型,它被稱爲引用計數”(retain counting):

            每一個對象都有一個引用計數(retain count) 

            對象被創建的時候,引用計數的值是

           當引用計數值是0的時候,對象將被系統統一銷燬(調用delloc方法)

            [receiver retainCount]得到retainCount的值

    

    

   2)獲得所有權的方法:

    

           alloc:爲一個新對象分配內存,並且它的引用計數爲1。調用alloc方法,你便有對新對象的所有權

            copy:製造一個對象的副本,該副本的引用計數爲1,調用者具有對副本的所有權

           retain:使對象的引用計數加1,並且獲得對象的所有權

    

    

    

   3)放棄所有權的方法:

    

           release:使對象的引用計數減1,並且放棄對象的所有權

           autorelease:使對象的引用計數在未來的某個時候(自動釋放池release的時候)1,並且在那個時候放棄對象的所有權


2.內存管理原則

    

   對你自己擁有的對象負責,你只能釋放你擁有的對象

   凡是通過retainalloccopy等手段獲得了所有權的對象,都必須在你不在使用他的時候,由你來調用releaseautorelease等手段來釋放對他的所有權

   在一定的代碼段內,對同一個對象所做的 copy,allocretain的操作次數應當與release autorelease操作的次數相等

   可以在類的dealloc方法中釋放你所佔有的實例變量

   對於便利構造器和訪問起來說,你沒有通過上面的這些手段獲得對象的所有權,因此在這些情況下你無須對獲得對象進行額外的釋放操作

   autorelease只不過意味着預定延遲發送一條release消息,當前的引用計數器並沒有變

    

    

    

   1)屬性與內存管理

    

           .h文件

           @property(retain,non atomic)NSString *name;   //name聲明的屬性是retain才需要在dellocrelease
        

           .m文件

           @synthsize name = _name

    

           -(void)dealloc

           {

                   [name release];  //釋放屬性

                   [super dealloc];

           }

    

   2)便利構造器內存管理

    

           自動釋放池 autoreleasepool

    

            只要對象用autorelease,他就被加到自動釋放池當中

           當自動釋放池release加入到自動釋放池的對象就會release,自動釋放池也會銷燬drain是把釋放池裏的對象release釋放池還在

           autorelease比較少用,⼀一般都是在便利構造器裏使用

    

    

    

        IOS5 新加的 ARC(自動內存釋放)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章