中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》
  • 首頁 > 
  • 教程 > 
  • 開發技術 > 
  • 屬性與內存管理(屬性與內存管理都是相互關聯的) 第二部分

屬性與內存管理(屬性與內存管理都是相互關聯的) 第二部分

發布時間:2020-06-26 22:33:13 來源:網絡 閱讀:421 作者:yjf123546 欄目:開發技術

,關于語義特性copy和與alloc對應的dealloc以及初始化操作和便利構造器的補充

1, 語義特性copy

如果想對一個對象進行copy操作,對象的類必須服從一個NSCopying協議,并且實現協議中的方法copyWithZone:,方法為(仍以Person類為例):

-(id)copyWithZone:(NSZone*)zone

{

    NSString*newSex = [[NSStringallocWithZone:zone]init];

    newSex.sex = self.sex;

    returnnewSex;

}

其中copyWithZone: 協議NSCopying制定的方法,

2, dealloc

對于dealloc方法,由于系統不知道我們在開發程序時會對那些對象的語義特性聲明為retain或者copy,所以需要我們重寫dealloc方法,即如下:

-(void)dealloc

{

 [_namerelease];

 [_sexrelease];

 NSLog(@"Person空間回收了");

 [superdealloc];

}

(1), [_namerelease][_sexrelease]操作目的:當調用dealloc方法時,該對象的空間將要被系統回收,在空間回收之前,將保有的其他對象()的所有權給釋放掉,當該類對象的引用計數為0,會自動調用該類的dealloc方法

(2), [superdealloc]該操作即必須通過super調用父類的方法實現,才能將空間回收,

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時調用了setter方法,內部對name進行了retain操作,_name也保留了name的使用權,如果使用_name = name即直接賦值方法,則就表示把屬性的語義特性設為asgin,這時如果name的空間已經被回收了,直接賦值就會出現野指針問題

使用self.sex = sex同理;

(4),便利構造器

+(id)teacherWithName:(NSString*)name sex:(NSString *)sex

{

  Person*person = [[Person alloc] initWithName:namesex:sex];

    return [Personautorelease];

}

我們在使用便利構造器時不需要再對其進行release操作,因為內部已經做了autorelease操作,如果在進行release操作會造成過度釋放,以后我們再寫便利構造器就要這樣寫.

,collection(集合) 的內存管理

當把一個對象放入集合(數組,字典,集合)中時,會將對象的引用計數 + 1,因為內部做了retain操作

例如: Person *per1 = [[Personalloc] initWithName:@"Frank"sex:@"boy"];

        Person *per2= [[Personalloc] initWithName:@"Duke"sex:@"boy"];

per1per2所指向的空的引用數都1,

NSMutableArray *array =[[NSMutableArray alloc ]initWithObjects:per1,per2, nil];

 這里使用便利構造器,其內部給添加到數組中的元素進行了autorelease操作,這時per1per2所指向的空的引用數都2,

當集合(數組,字典,集合)空間被回收時,他們會向容器中的每個元素發送一個release消息(對應添加元素時的retain操作),當從集合(數組,字典,集合)中移除一個元素時,release該對象,引用計數 - 1;

下面把對該數組對象以及存儲的對象的進行release操作

(1),[per1release];

        [per2release];

        NSLog(@"%lu",[ per1retainCount]);

        NSLog(@"%lu",[ per2retainCount]);

        per1per2所指向的空的引用數都1, array所指向的空的引用為1,

NSLog(@"%@",array);  出數中的內容

        [per1release];

        [per2release];

per1per2的空都被回收,統識別到他的引用數都0

        NSLog(@"%@",array);若再操作系crash,中存象已被系回收了,如果出相當于又對數組中被回收的空間進行操作,是野指針問題

NSLog(@"arrayCount= %lu",[array retainCount]);

array所指向的空的引用為1,因為array的空間沒有被回收,但不可以輸出數組

(2),[array release];

array所指向的空被系回收

        NSLog(@"%lu",[tea1retainCount]);

        NSLog(@"%lu",[tea2retainCount]);

per1per2所指向的空的引用數都1,

        NSLog(@"%@",array);若再操作系crash, 被回收, 如果出相當于被回收的數組進行操作,是野指針問題

 [per1release];

[per2release];

per1per2的空都被回收,統識別到他的引用數都0

NSLog(@"arrayCount= %lu",[array retainCount]);

行此操作,crash, 因為array的空間已經被回收


(3),  [per1release];

        [per2release];

per1per2所指向的空的引用數都1, array所指向的空的引用為1,

        [arrayrelease];

array所指向的空被系回收,per1per2的空間也都被回收,當集合(數組,字典,集合)空間被回收時,他們會向容器中的每個元素發送一個release消息(對應添加元素時的retain操作),即此時per1per2的空都被回收,收到了release消息,


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

綦江县| 固始县| 荣成市| 大港区| 临海市| 华蓥市| 苍梧县| 天柱县| 金阳县| 嫩江县| 宜君县| 四平市| 瑞丽市| 彩票| 山东省| 剑川县| 恭城| 霍州市| 尤溪县| 江安县| 黔西县| 天全县| 吐鲁番市| 南郑县| 望谟县| 三台县| 木里| 什邡市| 郑州市| 利辛县| 广灵县| 泸水县| 郴州市| 晋州市| 库伦旗| 邵阳市| 闽侯县| 南郑县| 宁夏| 江津市| 太和县|