国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

iOS非ARC基本內存管理系列3-循環retain和@class

2019-11-14 20:37:26
字體:
來源:轉載
供稿:網友

1.@class

  • 使用場景:對于循環依賴關系來說,比方A類引用B類,同時B類也引用A類;

  可以看出Person和Card互相引用,此時如果使用#import編譯報錯!因此當使用@class在兩個類中相互聲明,編譯不會報錯!

  • 用法:使用 @class 類名; 就可以引用一個類,說明一下它是一個類

@class和#import的區別:

  • #import方式會包含被引用類的所有信息,包括被引用類的變量和方法;@class方式只是告訴編譯器在A.h文件中 B *b 只是類的聲明,具體這個類里有什么信息,這里不需要知道,等實現文件中真正要用到時,才會真正去查看B類中信息
  • 如果有上百個頭文件都#import了同一個文件,或者這些文件依次被#imPRot,那么一旦最開始的頭文件稍有改動,后面引用到這個文件的所有類都需要重新編譯一遍,這樣的效率也是可想而知的,而相對來 講,使用@class方式就不會出現這種問題了
  • 在.m實現文件中,如果需要引用到被引用類的實體變量或者方法時,還需要使用#import方式引入被引用類

 

2.循環retain

  • 比如A對象retain了B對象,B對象retain了A對象
  • 這樣會導致A對象和B對象永遠無法釋放

3.解決方法

當兩端互相引用時,應該一端用retain、一端用assign 模擬代碼如下:

/**  需求:人擁有身份證,而身份證上顯示人的信息, 設計:分別設計Person類和Card類模擬 注意:兩個類循環引用因此設置Card一端為assign  */
/********************************* Person.h *************************************/#import <Foundation/Foundation.h>@class Card;@interface Person : NSObject@property (nonatomic,retain) Card *card;@end/********************************* Person.m *************************************/#import "Person.h"#import "Card.h"@implementation Person- (void)dealloc{    [_card release];        NSLog(@"Person對象被回收了");        [super dealloc];}@end/********************************* Card.h *************************************/#import <Foundation/Foundation.h>@class Person;@interface Card : NSObject// 雖然Person是類對象 但為了解決互相retain的問題 將Car的這一端的person設置成為assign@property (nonatomic,assign) Person *person;@end/********************************* Card.m *************************************/#import "Card.h"#import "Person.h"@implementation Card- (void)dealloc{    NSLog(@"Card對象被回收");        [super dealloc];}@end/********************************* main.m *************************************/#import <Foundation/Foundation.h>#import "Person.h"#import "Card.h"int main(int argc, const char * argv[]){    Person *person = [[Person alloc] init];    Card *card = [[Card alloc] init];        // 人擁有身份證    person.card = card; // 執行后card的引用計數 = 2        // 身份證上顯示的人的信息 Car中person中assign person引用計數 = 1    card.person = person;        // card計數-1    [card release];        // persong引用計數 = 0 person對象要被回收了 調用 person.dealloc 方法    [person release];        return 0;}

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 天台县| 八宿县| 固安县| 井冈山市| 桃江县| 包头市| 和静县| 新闻| 黄平县| 信阳市| 夹江县| 平定县| 依兰县| 巴林右旗| 龙门县| 榆社县| 梁平县| 巫溪县| 石台县| 论坛| 连山| 阳谷县| 辽宁省| 琼结县| 革吉县| 南木林县| 信丰县| 巫山县| 平安县| 邯郸市| 武冈市| 尖扎县| 中方县| 巴南区| 子长县| 安岳县| 宁国市| 高清| 彭山县| 宁明县| 西平县|