assign与weak区别(面试)
生活随笔
收集整理的這篇文章主要介紹了
assign与weak区别(面试)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?weak?比?assign?多了一個功能就是當屬性所指向的對象消失的時候(也就是內(nèi)存引用計數(shù)為0)會自動賦值為?nil?,這樣再向?weak?修飾的屬性發(fā)送消息就不會導(dǎo)致野指針操作crash。
可能不太好理解下面我寫了一個演示程序。
OC:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | // // ViewController.m // weak與assgin的區(qū)別 // // Created by bihongbo on 14/5/20. // Copyright (c) 2015年 畢洪博. All rights reserved. // #import "ViewController.h" @interface ViewController () @property (nonatomic,weak) id weakPoint; @property (nonatomic,assign) id assignPoint; @property (nonatomic,strong) id strongPoint; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.strongPoint = [NSDate date]; NSLog(@"strong屬性:%@",self.strongPoint); self.weakPoint = self.strongPoint; self.assignPoint = self.strongPoint; self.strongPoint = nil; NSLog(@"weak屬性:%@",self.weakPoint); // NSLog(@"assign屬性:%@",self.assignPoint); } @end |
當程序中的注釋被打開時,運行程序有可能會崩潰(有時候不崩潰,你可能需要多運行幾次),這是因為當?assign?指針所指向的內(nèi)存被釋放(釋放并不等于抹除,只是引用計數(shù)為0),不會自動賦值?nil?,這樣再引用?self.assignPoint?就會導(dǎo)致野指針操作,如果這個操作發(fā)生時內(nèi)存還沒有改變內(nèi)容,依舊可以輸出正確的結(jié)果,而如果發(fā)生時內(nèi)存內(nèi)容被改變了,就會crash。
結(jié)論:在?ARC?模式下編程時,指針變量一定要用?weak?修飾,只有基本數(shù)據(jù)類型和結(jié)構(gòu)體需要用?assgin?,例如?delegate?,一定要用?weak修飾。
轉(zhuǎn)載于:https://www.cnblogs.com/it-k-50/p/5857796.html
總結(jié)
以上是生活随笔為你收集整理的assign与weak区别(面试)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL联合查询:子表任一记录与主表联合查
- 下一篇: [dp]最长单调递增子序列LIS