關於iOS開發內存管理的那些事兒

1.在ObjC中對象是存儲在堆中的,系統並不會自動釋放堆中的內存(注意基本類型例如int,float是由系統自己管理的,放在棧上)

2.我們可以通過dealloc方法來查看是否一個對象已經被回收,如果沒有被回收則有可能造成內存泄露。如果一個對象被釋放之後,那麼最後引用它的變量我們手動設置爲nil,否則可能造成野指針錯誤,而且需要注意在ObjC中給空對象發送消息是不會引起錯誤的。野指針錯誤形式在Xcode中通常表現爲:Thread 1:EXC_BAD_ACCESS(code=EXC_I386_GPFLT)錯誤。因爲你訪問了一塊已經不屬於你的內存。

3.手動管理內存有時候並不容易,因爲對象的引用有時候是錯綜複雜的,對象之間可能互相交叉引用,此時需要遵循一個法則:誰創建,誰釋放

4.retain,通常用於非字符串對象

-(void)setA:(Car *)a{
    if(_a!=a){
        [_a release];
        _a=[a retain];
    }
}

copy,通常用於字符串對象、block、NSArray、NSDictionary

-(void)setA:(NSString *)a{
    if(_a!=a){
        [_a release];
        _a=[a copy];
    }
}

5.autorelease方法不會改變對象的引用計數器,只是將這個對象放到自動釋放池中; 

6.自動釋放池實質是當自動釋放池銷燬後調用對象的release方法,不一定就能銷燬對象(例如如果一個對象的引用計數器>1則此時就無法銷燬); 

7.由於自動釋放池最後統一銷燬對象,因此如果一個操作比較佔用內存(對象比較多或者對象佔用資源比較多),最好不要放到自動釋放池或者考慮放到多個自動釋放池; 

8.ObjC中類庫中的靜態方法一般都不需要手動釋放,內部已經調用了autorelease方法;

9.不同於XCode4可以在創建工程時選擇關閉ARC,XCode5在創建的工程是默認開啓ARC,沒有可以關閉ARC的選項。

如果需要對特定文件開啓或關閉ARC,可以在工程選項中選擇Targets -> Compile Phases -> Compile Sources,在裏面找到對應文件,添加flag:

打開ARC:-fobjc-arc

關閉ARC:-fno-objc-arc

10.某些具體介紹參考該網址,十分詳細http://www.cnblogs.com/flyFreeZn/p/4264220.html






參考網址:http://www.cnblogs.com/kenshincui/p/3870325.html

發佈了37 篇原創文章 · 獲贊 27 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章