四,關(guān)于語義特性copy和與alloc對應(yīng)的dealloc以及初始化操作和便利構(gòu)造器的補充
創(chuàng)新互聯(lián)建站成都網(wǎng)站建設(shè)按需網(wǎng)站開發(fā),是成都網(wǎng)站營銷推廣公司,為成都服務(wù)器托管提供網(wǎng)站建設(shè)服務(wù),有成熟的網(wǎng)站定制合作流程,提供網(wǎng)站定制設(shè)計服務(wù):原型圖制作、網(wǎng)站創(chuàng)意設(shè)計、前端HTML5制作、后臺程序開發(fā)等。成都網(wǎng)站推廣熱線:189820811081, 語義特性copy
如果想對一個對象進(jìn)行copy操作,對象的類必須服從一個NSCopying協(xié)議,并且實現(xiàn)協(xié)議中的方法copyWithZone:,方法為(仍以Person類為例):
-(id)copyWithZone:(NSZone*)zone
{
NSString*newSex = [[NSStringallocWithZone:zone]init];
newSex.sex = self.sex;
returnnewSex;
}
其中copyWithZone: 是協(xié)議NSCopying制定的方法,
2, dealloc
對于dealloc方法,由于系統(tǒng)不知道我們在開發(fā)程序時會對那些對象的語義特性聲明為retain或者copy,所以需要我們重寫dealloc方法,即如下:
-(void)dealloc
{
[_namerelease];
[_sexrelease];
NSLog(@"Person空間回收了");
[superdealloc];
}
(1), [_namerelease]和[_sexrelease]操作目的:當(dāng)調(diào)用dealloc方法時,該對象的空間將要被系統(tǒng)回收,在空間回收之前,將保有的其他對象()的所有權(quán)給釋放掉,當(dāng)該類對象的引用計數(shù)為0時,會自動調(diào)用該類的dealloc方法
(2), [superdealloc]該操作即必須通過super調(diào)用父類的方法實現(xiàn),才能將空間回收,
3, 初始化操作
-(id)initWithName:(NSString*)name sex:(NSString *)sex
{
self =[superinit];
if (self) {
self.name = name;
self.sex = sex;
}
returnself;
}
(1),使用self.name = name賦值方法,self.name時調(diào)用了setter方法,內(nèi)部對name進(jìn)行了retain操作,即_name也保留了name的使用權(quán),如果使用_name = name即直接賦值方法,則就表示把屬性的語義特性設(shè)為asgin,這時如果name的空間已經(jīng)被回收了,直接賦值就會出現(xiàn)野指針問題
使用self.sex = sex同理;
(4),便利構(gòu)造器
+(id)teacherWithName:(NSString*)name sex:(NSString *)sex
{
Person*person = [[Person alloc] initWithName:namesex:sex];
return [Personautorelease];
}
我們在使用便利構(gòu)造器時不需要再對其進(jìn)行release操作,因為內(nèi)部已經(jīng)做了autorelease操作,如果在進(jìn)行release操作會造成過度釋放,以后我們再寫便利構(gòu)造器就要這樣寫.
五,collection(集合) 的內(nèi)存管理
當(dāng)把一個對象放入集合(數(shù)組,字典,集合)中時,會將對象的引用計數(shù) + 1,因為內(nèi)部做了retain操作
例如: Person *per1 = [[Personalloc] initWithName:@"Frank"sex:@"boy"];
Person *per2= [[Personalloc] initWithName:@"Duke"sex:@"boy"];
此時per1和per2所指向的空間的引用計數(shù)都為1,
NSMutableArray *array =[[NSMutableArray alloc ]initWithObjects:per1,per2, nil];
這里使用便利構(gòu)造器,其內(nèi)部給添加到數(shù)組中的元素進(jìn)行了autorelease操作,這時per1和per2所指向的空間的引用計數(shù)都為2,
當(dāng)集合(數(shù)組,字典,集合)空間被回收時,他們會向容器中的每個元素發(fā)送一個release消息(對應(yīng)添加元素時的retain操作),當(dāng)從集合(數(shù)組,字典,集合)中移除一個元素時,會release該對象,引用計數(shù) - 1;
下面把對該數(shù)組對象以及存儲的對象的進(jìn)行release操作
(1),[per1release];
[per2release];
NSLog(@"%lu",[ per1retainCount]);
NSLog(@"%lu",[ per2retainCount]);
此時 per1和per2所指向的空間的引用計數(shù)都為1, array所指向的空間的引用計數(shù)為1,
NSLog(@"%@",array); 此時會輸出數(shù)組中的內(nèi)容
[per1release];
[per2release];
此時per1和per2的空間都被回收,因為系統(tǒng)識別到他們的引用計數(shù)都為0
NSLog(@"%@",array);此時若再執(zhí)行該操作系統(tǒng)會crash,因為數(shù)組中存儲的對象已經(jīng)被系統(tǒng)回收了,如果輸出相當(dāng)于又對數(shù)組中被回收的空間進(jìn)行操作,是野指針問題
NSLog(@"arrayCount= %lu",[array retainCount]);
此時array所指向的空間的引用計數(shù)為1,因為array的空間沒有被回收,但不可以輸出數(shù)組
(2),[array release];
此時array所指向的空間被系統(tǒng)回收
NSLog(@"%lu",[tea1retainCount]);
NSLog(@"%lu",[tea2retainCount]);
此時per1和per2所指向的空間的引用計數(shù)都為1,
NSLog(@"%@",array);此時若再執(zhí)行該操作系統(tǒng)會crash, 因為數(shù)組已經(jīng)被回收, 如果輸出相當(dāng)于對被回收的數(shù)組進(jìn)行操作,是野指針問題
[per1release];
[per2release];
此時per1和per2的空間都被回收,因為系統(tǒng)識別到他們的引用計數(shù)都為0
NSLog(@"arrayCount= %lu",[array retainCount]);
若進(jìn)行此操作,會crash, 因為array的空間已經(jīng)被回收
(3), [per1release];
[per2release];
此時per1和per2所指向的空間的引用計數(shù)都為1, array所指向的空間的引用計數(shù)為1,
[arrayrelease];
此時array所指向的空間被系統(tǒng)回收,per1和per2的空間也都被回收,當(dāng)集合(數(shù)組,字典,集合)空間被回收時,他們會向容器中的每個元素發(fā)送一個release消息(對應(yīng)添加元素時的retain操作),即此時per1和per2的空間都被回收,因為他們收到了release消息,
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。