1. 程式人生 > >芒果iOS開發之記憶體管理二

芒果iOS開發之記憶體管理二

/********** OC第十講記憶體管理 **********/

主要內容

 1.屬性的內部實現原理

 2.dealloc內釋放例項變數

 3.便利構造器方法的實現原理

 4.collection的記憶體管理

/******* 1.屬性的內部實現原理  ********/

       /*

屬性的語義設定以及使用範圍

        1.assign

        2.retian

        3.copy

        */

//把物件型別的屬性語義設定成assign

        //person1的引用計數為1

        Person *person1 = [[Person

alloc] init];

//sexretainCount1

        NSString *sex = [[NSString alloc] initWithFormat:@"%@",@""];

NSLog(@"sex.retainCount = %lu", sex.retainCount);

        person1.gender = sex; //等價於 [person1 setGender:sex];

//物件在使用完之後就需要釋放

        [sex release];

//sexretainCount0,此時已被dealloc方法釋放,再訪問該物件就會引起野指標訪問異常

        NSLog(@"sex = %@", person1.gender);

        [person1 release];

//把物件型別的屬性語義設定成reatin

//person2retaincount1

        Person *person2 = [[Person alloc] init];

//name此時的retaincount也是1

        NSString *xingming = [NSString stringWithFormat:@"%@",@"周杰倫"];

NSLog(@"xingming.retainCount = %lu", xingming.

retainCount);

//person2的屬性name語義關鍵字是retain,也就是會持有xingming,讓xingming的引用計數又+1,此時xingmingretaincount2

        person2.name = xingming;

NSLog(@"xingming.retainCount = %lu", xingming.retainCount);

//當我們不需要的時候就釋放自己得所有權。

        [xingming release];     //release之後引用計數-1

NSLog(@"xingming.retainCount = %lu", xingming.retainCount);

//person2釋放的時候,會連帶xingming的所有權也釋放掉,此時xingming的引用計數變成0,會系統自動釋放

        [person2 release];


//列印結果

2015-11-16 11:14:28.251 OC-LessionTen[1170:51432] xingming.retainCount = 1

2015-11-16 11:14:28.251 OC-LessionTen[1170:51432] xingming.retainCount = 2

2015-11-16 11:14:28.251 OC-LessionTen[1170:51432] xingming.retainCount = 1


當person2釋放的時候,同時釋放掉xingming的所有權,那麼xingming也會被釋放掉。