一:四種方式
? ? 1.自己生成的對象,自己持有
? ? 2.非自己生成的對象,自己也能持有
? ? 3.不再需要自己持有的對象時釋放
? ? 4.無法釋放非自己持有的對象
二:四種方式詳解
? ? 1.自己生成的對象,自己持有:
? ? 通過alloc,new,copy,mutableCopy方法生成的對象為自己生成并持有
? ? id obj = [[NSObject alloc] init];
? ? 2.非自己生成的對象,自己也能持有
? ? 用alloc,new,copy,mutableCopy以外的方法取得的對象,自己不持有該對象.調用retain方法后才持有該對象
? ? // 取得對象存在,但自己不持有該對象
? ? id object = [NSMutableArray ? array];
? ? // 自己持有對象
? ? [obj ?retain];
? ? 3.不再需要自己持有的對象時釋放
?? ?3.1 情況一: ?// 自己生成并持有對象?
? ? id obj = [[NSObject alloc] init];
? ? // 釋放對象(指向對象的指針仍然被保留在變量obj中,貌似能夠訪問,但對象一經釋放絕對不可訪問)
? ? [obj release];
? ? 3.1 情況二:? // 非自己生成并持有對象
? ? // 取得對象存在,但自己不持有該對象
? ? id object = [NSMutableArray? array];
? ? // 自己持有對象
? ? [obj? retain];
? ? // 釋放對象
? ? [obj release];
? ? 注意: 1. release是立即釋放; 2. autorelease不立即釋放,注冊到autoreleasepool中,等到 ? ? ? pool結束時再調用release釋放對象.
? ? 4.無法釋放非自己持有的對象
4.1 取得對象存在,并持有對象時釋放
id obj = [[NSObject alloc] init];
// 釋放對象
[obj release];
// 釋放對象之后再次釋放(此時由于對象已經被釋放,所以現在不持有該對象,這時再次釋放會導致崩潰)
[obj release];
4.1 取得對象存在,但不持有對象時釋放
// 取得對象存在,但自己不持有該對象
id object = [NSMutableArray? array];
[obj? release]; // 由于此時釋放了自己不持有的對象,會造成崩潰