1.本身生成的對象,本身持有spa
用alloc、new、copy、mutableCopy 意味着本身生成的對象,只有本身持有code
代碼舉例:對象
//本身生成並持有對象 id obj = [[NSObject alloc] init]; id obj = [NSObject new];
2.非本身生成的對象,本身也能持有內存
用上面的alloc、new、copy、mutableCopy之外 的方法取得的對象,不是本身生成並持有。因此本身不是該對象的持有者it
代碼舉例:內存管理
/** 取得非本身生成並持有的對象 取得的對象存在,但本身不持有對象 */ id obj = [NSMutableArray array];
使用 retain 方法能夠持有對象table
[obj retain]; //本身持有對象class
經過retain方法,變成了本身所持有的對象了 object
思考:[NSMutableArray array] 方法 能夠取得的對象存在,但本身不持有對象,是怎麼作到的?程序
- (id)object{ //本身持有對象 id obj = [[NSObject alloc] init]; //取得的對象存在, 但本身不持有對象 [obj autorelease]; return obj; }
autorelease方法,能夠使 取得的對象存在, 但本身不持有對象
3.再也不須要 本身持有的對象時 ,釋放對象
用release方法
代碼舉例:
id obj = [[NSObject alloc] init]; //釋放對象 [obj release];
4.沒法釋放 非本身持有的對象
若是這麼作 程序會奔潰
代碼舉例:
id obj = [[NSObject alloc] init]; //對象釋放 [obj release]; //釋放以後再次釋放 已經非本身持有的對象,程序會崩潰 [obj release];
注意:若是取得的對象存在,但本身不持有對象 時, 釋放的話,也是崩潰