在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/C  iOS  網(wǎng)絡(luò)安全/ iOS 開(kāi)發(fā) issue:一個(gè)assign 和 weak 的 實(shí)例分析

iOS 開(kāi)發(fā) issue:一個(gè)assign 和 weak 的 實(shí)例分析

iOS 開(kāi)發(fā), 使用Objective-C, 屬性前面用assign 和 weak 修飾。
使用assign修飾對(duì)象,會(huì)導(dǎo)致野指針。因?yàn)閍ssign修飾的對(duì)象銷毀后,refence 沒(méi)有置為nil.

我同事寫(xiě)了很多這樣的代碼,為什么App運(yùn)行好好的,從來(lái)沒(méi)有Crash?

@interface ZBStoreInfoVC : UIViewController

@property (nonatomic,assign) id<ZBStoreInfoVCDelegate> delegate;

@end

id<Delegate> delegate 一般賦給另外一個(gè)UIViewController,
是對(duì)象。不是值類型

回答
編輯回答
澐染

1.這么寫(xiě)肯定是會(huì)不對(duì)的,會(huì)崩潰。稍微寫(xiě)個(gè)小測(cè)試,確實(shí)會(huì)奔潰。

Book *book = [[Book alloc] init];

{    //從作用域出去后store就會(huì)釋放
    Store *store = [[Store alloc] init];
    book.delegate = store;
}
[book test];
.....
-(void)test{
    
    NSLog(@"book test");
    
    if ([self.delegate respondsToSelector:@selector(testDelegate)]) {
        [self.delegate testDelegate];
    }
}

2.為什么沒(méi)出現(xiàn)奔潰?可能是delegate很少優(yōu)先于self釋放,可能delegate因?yàn)槠渌驔](méi)釋放(單例或者引用循環(huán)等)。一般來(lái)說(shuō)被委托者應(yīng)該在更深的層級(jí),會(huì)先釋放,比如界面A->B->C,這樣情況,肯定是C作為B的委托,C會(huì)先于B釋放。這個(gè)問(wèn)題你逐個(gè)的檢查一下為什么沒(méi)有奔潰。主要看:是否delegate釋放了還回去調(diào)用self.delegate之類的。

2017年3月9日 13:08
編輯回答
萌吟

使用weak修飾時(shí), 當(dāng)屬性所指向的對(duì)象內(nèi)存引用計(jì)數(shù)為0時(shí)會(huì)自動(dòng)賦值為nil, 而assign則不會(huì).
所以當(dāng)assign修飾的delegate指向的對(duì)象dealloc(內(nèi)存釋放)后, 再去訪問(wèn)deleagte系統(tǒng)會(huì)奔潰

2017年2月28日 21:11
編輯回答
不舍棄

運(yùn)行程序有可能會(huì)崩潰(有時(shí)候不崩潰,你可能需要多運(yùn)行幾次),這是因?yàn)楫?dāng) assign 指針?biāo)赶虻膬?nèi)存被釋放(釋放并不等于抹除,只是引用計(jì)數(shù)為0),不會(huì)自動(dòng)賦值 nil ,這樣再引用 self.assignPoint 就會(huì)導(dǎo)致野指針操作,如果這個(gè)操作發(fā)生時(shí)內(nèi)存還沒(méi)有改變內(nèi)容,依舊可以輸出正確的結(jié)果,而如果發(fā)生時(shí)內(nèi)存內(nèi)容被改變了,就會(huì)crash。

結(jié)論:在 ARC 模式下編程時(shí),指針變量一定要用 weak 修飾,只有基本數(shù)據(jù)類型和結(jié)構(gòu)體需要用 assgin ,例如 delegate ,一定要用 weak 修飾。

http://bihongbo.com/2014/05/2...
2018年4月15日 09:48