先想到这里,后边我们再去印证
我们再来看一段代码:
//取的非自己生成并持有的对象,
//取得对象的存在,但自己不持有对象。
id unretain_obj = [NSMutableArray array];
NSLog(@"unretain_obj retain count = %lu", (unsigned long)[unretain_obj retainCount]);
//自己持有对象
[unretain_obj retain];
NSLog(@"unretain_obj retain count = %lu", (unsigned long)[unretain_obj retainCount]);
//释放自己持有的对象
[unretain_obj release];
NSLog(@"unretain_obj retain count = %lu", (unsigned long)[unretain_obj retainCount]);
打印结果
2016-12-21 15:40:20.774 acm[65682:861135] unretain_obj retain count = 1
2016-12-21 15:40:20.774 acm[65682:861135] unretain_obj retain count = 2
2016-12-21 15:40:25.254 acm[65682:861135] unretain_obj retain count = 1
并且程序也不会崩溃。
着也印证了我们上边的想法。
因为通过retain方法,非自己生成的对象跟用alloc/new/copy/mutableCopy方法生成并持有的对象一样,成了自己所持有的
不在需要自己持有的对象时释放
通过上边的例子我们知道,自己持有的对象在释放时调用release方法,eg:
//自己生成并持有对象
id release_obj = [[NSObject alloc] init];
//将自己持有的对象释放
[release_obj release];
/*
* 释放对象
* 指向对象的指针依然被保留在变量release_obj 中,你依然可以调用它。
* 但是对象一经释放绝对不可访问,否则会造成程序崩溃。
* 出现EXC_BAD_ACCESS Crash问题
*/
我们自己实现一个方法,返回一个方法调用着也可以持有的对象,即alloc的作用
- (id)allocObject {
//自己生成并持有对象
id obj = [[NSObject alloc] init];
//原封不动的返回一个由alloc方法生成的对象
return obj;
注:方法名符合 生成并持有对象 alloc/copy/mutableCopy/new或以此开头的方法 规则
我们自己实现一个方法,返回一个谁也不持有的对象,只是取得对象的存在
- (id)object {
//自己生成并持有对象
id obj = [[NSObject alloc] init];
//调用autorelease方法 取得对象的存在,但自己不持有对象。
[obj autorelease];
return obj;
autorelease方法可以取得对象的存在,但自己不持有对象。使对象在超出指定的生存范围时能够自动的并正确的释放(调用release方法)
autorelease和release方法的区别
autorelease:

release:










