iOS開發(fā) 內(nèi)存管理strong weak 面試題

@property (nonatomic, weak) UIView *weakView;
@property (nonatomic, strong) UIView *strongView;
- (void)viewDidLoad {
  [super viewDidLoad];
  
  self.strongView = [[UIView alloc]initWithFrame:CGRectMake(25, 25, 50, 50)];
  printf("%ld",CFGetRetainCount((__bridge CFTypeRef)(self.strongView)));
  [self.view addSubview:self.strongView];
  printf("%ld",CFGetRetainCount((__bridge CFTypeRef)(self.strongView)));
  
  _strongView = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 50, 50)];
  printf("%ld",CFGetRetainCount((__bridge CFTypeRef)(_strongView)));
  [self.view addSubview:self.strongView];
  printf("%ld",CFGetRetainCount((__bridge CFTypeRef)(_strongView)));
  
  UIView *selfView = [[UIView alloc]initWithFrame:CGRectMake(150, 150, 50, 50)];
  self.weakView = selfView;
  printf("%ld",CFGetRetainCount((__bridge CFTypeRef)(self.weakView)));
  [self.view addSubview:self.weakView];
  printf("%ld",CFGetRetainCount((__bridge CFTypeRef)(self.weakView)));
  
  UIView *weaksView = [[UIView alloc]initWithFrame:CGRectMake(200, 200, 50, 50)];
  printf("%ld",CFGetRetainCount((__bridge CFTypeRef)(weaksView)));
  _weakView = weaksView;
  printf("%ld",CFGetRetainCount((__bridge CFTypeRef)(_weakView)));
  [self.view addSubview:_weakView];
  printf("%ld",CFGetRetainCount((__bridge CFTypeRef)(_weakView)));
  }

請按順序?qū)懗錾鲜龃蛴〗Y(jié)果呻右。

答案如下

self.selfStrongView = [[UIView alloc]initWithFrame:CGRectMake(25, 25, 50, 50)];
printf("self.selfStrongViewretain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(self.selfStrongView)));

打印結(jié)果是2 因為alloc init 會生成一個強引用 引用計數(shù)+1
self.selfStringView由于走了set方法 引用計數(shù)+1

[self.view addSubview:self.selfStrongView];
printf("self.selfStrongView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(self.selfStrongView)));

打印結(jié)果是3 因為addSubview 內(nèi)部會把這個view添加到subviews數(shù)組里

@property(nonatomic,readonly,copy) NSArray<__kindof UIView *> *subviews;

這個數(shù)組是用copy修飾的疚宇,所以會生成一個強引用 引用計數(shù)+1

_strongView = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 50, 50)];
printf("_strongView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(_strongView)));

打印結(jié)果為1 因為_strongView不生成set方法 所以只有alloc init 生成的一個強引用 引用計數(shù)+1

[self.view addSubview:self.strongView];
printf("_strongView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(_strongView)));

打印結(jié)果為2 原因同上一個addsubview

媽的重點來了淫茵,昨天研究這三行代碼百度一晚上
知識點 : 用weak修飾的 self.語法并不會使引用計數(shù)+1

UIView *selfView = [[UIView alloc]initWithFrame:CGRectMake(150, 150, 50, 50)];
self.selfWeakView = selfView;
printf("self.selfWeakView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(self.selfWeakView)));

打印結(jié)果為2 上文中我們知道 selfView的引用計數(shù)為1 為什么把值付給self.WeakView 引用計數(shù)就為2了呢
當我們把__weak修飾的變量傳進NSLog方法中打印,這個方法需要持有這個變量咪奖,為了安全起見嘛辅鲸,如果不強引用一下,萬一還沒打印的被釋放了呢展箱?
所以會對selfView調(diào)用objc_loadWeakRetained, 這時候selfView的引用計數(shù)就會+1旨枯,在NSLog結(jié)束是,會調(diào)用objc_release, 然后引用計數(shù)-1混驰。

[self.view addSubview:self.selfWeakView];
printf("self.selfWeakView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(self.selfWeakView)));

打印結(jié)果為3 因為addsubview

UIView *weaksView = [[UIView alloc]initWithFrame:CGRectMake(200, 200, 50, 50)];
printf("weakView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(weaksView)));
_weakView = weaksView;
printf("_weakView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(_weakView)));
[self.view addSubview:_weakView];
printf("_weakView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(_weakView)));

打印結(jié)果分別為1 2 3 原因上邊兒都有

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末攀隔,一起剝皮案震驚了整個濱河市皂贩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌昆汹,老刑警劉巖明刷,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異满粗,居然都是意外死亡辈末,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門映皆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挤聘,“玉大人,你說我怎么就攤上這事捅彻∽槿ィ” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵步淹,是天一觀的道長从隆。 經(jīng)常有香客問我,道長缭裆,這世上最難降的妖魔是什么广料? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮幼驶,結(jié)果婚禮上艾杏,老公的妹妹穿的比我還像新娘。我一直安慰自己盅藻,他們只是感情好购桑,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著氏淑,像睡著了一般勃蜘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上假残,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天缭贡,我揣著相機與錄音,去河邊找鬼辉懒。 笑死阳惹,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的眶俩。 我是一名探鬼主播莹汤,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼颠印!你這毒婦竟也來了纲岭?” 一聲冷哼從身側(cè)響起抹竹,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎止潮,沒想到半個月后窃判,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡喇闸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年兢孝,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仅偎。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖雳殊,靈堂內(nèi)的尸體忽然破棺而出橘沥,到底是詐尸還是另有隱情,我是刑警寧澤夯秃,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布座咆,位于F島的核電站,受9級特大地震影響仓洼,放射性物質(zhì)發(fā)生泄漏介陶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一色建、第九天 我趴在偏房一處隱蔽的房頂上張望哺呜。 院中可真熱鬧,春花似錦箕戳、人聲如沸某残。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽玻墅。三九已至,卻和暖如春壮虫,著一層夾襖步出監(jiān)牢的瞬間澳厢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工囚似, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留剩拢,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓饶唤,卻偏偏與公主長得像裸扶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子搬素,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容