ios 編程日記 :內存問題彙總

(1)UIView本身佔用的內存並不是很大,但是使用這個方法(tempImage過大會佔用很高的內存)

setBackgroundColor:[UIColor colorWithPatternImage:tempImage],這個怎麼解決呢?推薦使用UIImageView,然後再setImage這個方法,這樣內存基本不會增長

(2)任何一個UIView如果沒有被remove掉,即使它被release掉了,依然佔用着大量內存.UIView需要remove,數組需要清空;對於一個擁有大量subView的UIView,要最好使用一個for循環來執remove操作for(UIView * temp in [myview subviews]) {temp removeFromSuperview}

(3)隱藏內存泄漏,比如一個UIView,fatherView,上面有許多的子視圖(subviews),如果有釋放內存的時候僅僅釋放fatherView的內存(對其執行remove,release操作),那麼此處必定內存無法回收。即使你的subviews已經release了,retainCount=0,但是並沒有remove,所以這也是內存泄漏。

(4)下面說說alloc、retain、copy,見到這三個不用說必須release。alloc和retain都會造成計數器+1

ClassA *obj1 = [[ClassA alloc] init];// obj1的計數器加1

ClassA *obj2=obj1;                       // obj1的計數器再次加1爲2

[obj2 retain];                                //  這樣寫計數器加1爲1

[obj1 release];                              //  obj1的計數器減1爲0

[obj2 release];                              //  這裏也可以寫成[obj1 release] ,基於誰retain誰釋放原則最好不這麼寫

----------------------------

說下copy深拷貝和retain淺拷貝的區別

ClassA *obj1 = [[ClassA alloc] init]; // obj1計數器j加1

ClassA *obj2 = [obj1 copy]            //  obj1計數器不加1,obj2計數器加1

[obj1 release]                                 // obj2計數器爲0,釋放時必須這樣寫了

[obj2 release]                                 // obj1計數器爲0

如上,這裏注意釋放對象及釋放順序

(5)關於屬性聲明,首先說說@property

@property:你可以理解爲系統給你寫了get/set方法

-(NSString*) name{
    return _name;
}
-(void) setName:(NSString *)name{ if (_name != name) { [_name release]; _name = [name retain];//這行就是下面解釋的屬性中你定義的屬性起到的作用 }}

readonly屬性: 只能讀,不能寫;
assign屬性: 是默認屬性,直接賦值,沒有任何保留與釋放問題;
retain屬性: 會增加原有對象的引用計數並且在賦值前會釋放原有對象,然後在進行賦值;
copy屬性: 會複製原有對象,並在賦值前釋放原有對象,然後在進行賦值;

atomic、assign、readwrite這三種屬性是默認的,可不寫,基本上所有@property都是noatomic的,也就是非線程安全的

除了基本類型和delegate用assign,其他都用retain,有因爲assign是默認屬性,所以類似

@property(atomic,assign) int i; 
可以直接寫成
@property int i;  


說道屬性順便說下self.屬性 = 值,self set屬性 = 值,屬性 = 值,這三種賦值的區別

第一種和第二種方式都會造成計數器加1,需要release掉,而第三種直接賦值給屬性可以稱爲弱引用沒有計數器加1。如果釋放掉後會造成n內存釋放過度。

(6)[(UIButton *)[self.view viewWithTag:123] removeFromSuperview]和[[self.view viewWithTag:123] removeFromSuperview]效果是不一樣的,通過tag取出來的對象需要類型轉換才能正確移除掉;

(7)完全釋放一個對象的參考代碼: 

m_text = nil;

[m_text release]; 

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