1.引用計(jì)數(shù)
ios內(nèi)存管理采用引用計(jì)數(shù)方式,舉個(gè)最簡(jiǎn)單的例子:
1.把內(nèi)存比喻成房子捞蛋,人是一個(gè)對(duì)象
2.假設(shè)有A,B,C,D四人依次進(jìn)入房子拟杉,和依次退出房子
3.現(xiàn)有邏輯為開燈生成對(duì)象,需要照明持有對(duì)象穴店,不需要照明釋放對(duì)象拿穴,關(guān)燈廢棄對(duì)象
4.A進(jìn)入房子并開燈(計(jì)數(shù)為1)-->B進(jìn)入房子,由于房間已開燈無需再次開燈(計(jì)數(shù)加1)-->C進(jìn)入房子贞言,由于房間已開燈無需再次開燈(計(jì)數(shù)加1)-->D進(jìn)入房子阀蒂,由于房間已開燈無需再次開燈(計(jì)數(shù)加1)
5.A退出房子蚤霞,由于房間有人,無需關(guān)燈(計(jì)數(shù)減1)-->B退出房子规肴,由于房間有人,無需關(guān)燈(計(jì)數(shù)減1))-->C退出房子拖刃,由于房間有人,無需關(guān)燈(計(jì)數(shù)減1)-->D退出房子央碟,房間無人均函,關(guān)燈(計(jì)數(shù)為0)
2.思考方式
內(nèi)存管理思考方式有四種
1.自己生成的對(duì)象自己持有(alloc/new/copy/mutablecopy)
2.非自己生成的對(duì)象自己也能持有(retain)
3.不需要自己持有的對(duì)象釋放(release)
4.非自己持有對(duì)象無法釋放(delloc)
3.所有權(quán)修飾符
__strong 強(qiáng)引用,對(duì)象和id的默認(rèn)修飾符,當(dāng)其持有對(duì)象超出變量域時(shí)候苞也,強(qiáng)引用失效,會(huì)自動(dòng)釋放對(duì)象
{
id __strong obj0 = [[NSObject alloc]init];//obj0持有對(duì)象A
id __strong obj1 = [[NSObject alloc]init];//obj1持有對(duì)象B
obj0 = obj1;//obj1值賦給obj0,obj0持有對(duì)象B 對(duì)象A強(qiáng)引用失效如迟,對(duì)象A被廢棄
}
關(guān)于__strong使用弊端殷勘,循環(huán)引用導(dǎo)致內(nèi)存泄漏
@interface ObjectTest : NSObject{
id __strong objA;
}
-(void)setObject:(id __strong)obj;
@end
@implementation ObjectTest
-(void)setObject:(id __strong)obj{
objA = obj;
}
定義一個(gè)帶有強(qiáng)引用的對(duì)象
{
id __strong test0 = [[ObjectTest alloc]init];//test0持有對(duì)象A
id __strong test1 = [[ObjectTest alloc]init];//test1持有對(duì)象B
[test0 setObject:test1];//objA 持有對(duì)象B test1持有對(duì)象B
[test1 setObject:test0];//objA 持有對(duì)象A test0 持有對(duì)象A
}
//當(dāng)test0 和test1 強(qiáng)引用失效時(shí) A B都被釋放劳吠,但 objA還是持有A 和B的強(qiáng)引用,這時(shí)候內(nèi)測(cè)泄漏
當(dāng)只定義一個(gè)對(duì)象時(shí)痒玩,也會(huì)發(fā)生循環(huán)引用,但是這時(shí)候強(qiáng)引用的對(duì)象是它自己奴曙,這時(shí)候我們就需要weak來避免循環(huán)了
__weak 不持有強(qiáng)引用對(duì)象草讶,當(dāng)某對(duì)象弱引用的時(shí)候,如果該對(duì)象被廢棄坤溃,弱引用自動(dòng)失效并被置空
id __weak test1 = nil;
{
id __strong test0 = [[ObjectTest alloc]init];
test1 = test0;
NSLog(@"test0=%@",test0);
}
NSLog(@"test1=%@",test1);//超出作用域自動(dòng)置空
__unsafe _unretained 不安全修飾符嘱丢,在IOS4之前使用
__autoreleasing 當(dāng)指針沒有顯示指定修飾符的時(shí)候用的就是__autoreleasing 比如之前的id obj 等同于 id __strong obj 但是id *obj 等同于 id __autoreleasing *obj