Objective-C語言使用引用計數來管理內存,也就是說,每一個對象都有個能夠遞增或遞減的計數器。若是想使某個對象繼續存活,那就遞增其引用計數;用完以後,就遞減其計數。計數變爲0時,就表示沒有人在繼續關注該對象了,因而就能夠把它銷燬。(iOS從未支持過垃圾回收機制)bash
使用alloc、new、copy、mutableCopy開頭的方法名,意味着本身生成的對象本身持有。框架
id obj = [[NSObject alloc] init];
id obj = [NSObject new];
複製代碼
使用上面方法以外的方法取得的對象,爲非本身生成的對象,因此本身也不是該對象的持有者。能夠使用retain方法持有非本身生成的對象。學習
id obj = [NSMutableArray array]; // 取得的對象存在,但本身不持有對象
[obj retain]; // 本身持有對象
複製代碼
本身持有的對象,不在須要時,持有者有義務釋放該對象。使用release方法釋放對象。當對象的引用計數爲0時,則該對象被銷燬(dealloc)。spa
id obj = [[NSObject alloc] init];
[obj release];
id obj = [NSMutableArray array];
[obj retain];
[obj release];
複製代碼
注意:對象被釋放後,不可再被訪問code
在應用程序中,釋放非本身持有的對象會形成崩潰。cdn
id obj = [[NSObject alloc] init];
[obj release];
[obj release];
id obj = [NSMutableArray array];
[obj release]
//這兩種狀況都是釋放了非本身持有的對象,都會致使應用程序崩潰
複製代碼
這些關於Objective-C的內存管理方法,實際上不包括在該語言中,而是包含在Cocoa框架中。Cocoa框架中的Foundation框架中的NSObject類擔負了內存管理職責。上述提到的alloc/retain/release/dealloc等方法都是NSObject類提供的方法。對象
歡迎關注iOS學習社區公衆號,學習更多iOS知識,iOS工做交流。blog