(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;