ios開(kāi)發(fā)weak原理 ios開(kāi)發(fā) websocket

iOS-底層原理26:weak原理

weak是OC中用于打破對(duì)象間的循環(huán)引用的一種技術(shù)。 weak 修飾一個(gè)變量時(shí),表示該指針變量可以使用但不擁有該對(duì)象;及 weak 引用指向?qū)ο髸r(shí),對(duì)象的引用計(jì)數(shù)并不增加。

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到天山網(wǎng)站設(shè)計(jì)與天山網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都做網(wǎng)站、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、空間域名、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋天山地區(qū)。

weak_table_t 是全局的弱引用表,將對(duì)象id存儲(chǔ)為鍵,將 weak_entry_t 存儲(chǔ)為它們的值。在我們的App中,多個(gè)對(duì)象會(huì)重用同一個(gè) SideTable 節(jié)點(diǎn),也就是說(shuō), weak_table 會(huì)存儲(chǔ)多個(gè)對(duì)象的弱引用信息。

底層原理毫無(wú)疑問(wèn)還是iOS開(kāi)發(fā)現(xiàn)在必備能力。

weak表示一個(gè)指針對(duì)一塊內(nèi)存進(jìn)行弱引用。弱引用就是不增加所指向內(nèi)存的引用計(jì)數(shù)。assign主要用于修飾基本數(shù)據(jù)類型,如NSInteger和CGFloat,這些數(shù)值主要存在于棧上。

OC中weak的原理

1、weak是OC中用于打破對(duì)象間的循環(huán)引用的一種技術(shù)。 weak 修飾一個(gè)變量時(shí),表示該指針變量可以使用但不擁有該對(duì)象;及 weak 引用指向?qū)ο髸r(shí),對(duì)象的引用計(jì)數(shù)并不增加。

2、weak 一般用來(lái)修飾對(duì)象,assign一般用來(lái)修飾基本數(shù)據(jù)類型。原因是assign修飾的對(duì)象被釋放后,指針的地址依然存在,造成野指針,在堆上容易造成崩潰。而棧上的內(nèi)存系統(tǒng)會(huì)自動(dòng)處理,不會(huì)造成野指針。copy與strong類似。

3、在 delegate,block,NSTimer 等中使用,以避免循環(huán)引用所帶來(lái)的內(nèi)存泄漏。我們使用xib時(shí),拖出來(lái)的控件都使用weak這一屬性。

4、在ObjectiveC里,用@property訪問(wèn)所有的實(shí)例變量。@property有一對(duì)屬性:strong 和 weak。

5、使用 __weak 修飾self,使其在block中不被持有,打破循環(huán)引用。開(kāi)始狀態(tài)如下 當(dāng)someObj對(duì)象釋放self對(duì)象時(shí),Self的retainCount為0,走dealloc,釋放myBlock對(duì)象,使其retainCount也為0。

weak原理

weak是OC中用于打破對(duì)象間的循環(huán)引用的一種技術(shù)。 weak 修飾一個(gè)變量時(shí),表示該指針變量可以使用但不擁有該對(duì)象;及 weak 引用指向?qū)ο髸r(shí),對(duì)象的引用計(jì)數(shù)并不增加。

weak_table_t 是全局的弱引用表,將對(duì)象id存儲(chǔ)為鍵,將 weak_entry_t 存儲(chǔ)為它們的值。在我們的App中,多個(gè)對(duì)象會(huì)重用同一個(gè) SideTable 節(jié)點(diǎn),也就是說(shuō), weak_table 會(huì)存儲(chǔ)多個(gè)對(duì)象的弱引用信息。

根據(jù)蘋(píng)果guan 方文檔的建議,如果捕獲的引用永遠(yuǎn)不會(huì)變?yōu)?nil ,我們應(yīng)該使用 unowned ,否則應(yīng)該使用 weak 。

理解這點(diǎn)很重要,這是許多使用 __weak,__stong 的由來(lái),實(shí)際的過(guò)程原理與block實(shí)現(xiàn)有關(guān),下文會(huì)補(bǔ)充,這里先記住這點(diǎn)。注:如果是在MRC模式下,使用 __block 修飾self,則此時(shí)block訪問(wèn)被釋放的self,則會(huì)導(dǎo)致crash。

如果使用weak,對(duì)性能的需求是要大于strong的,可能是這個(gè)原因?qū)е碌?,這個(gè)只是猜測(cè)。如果有哪位同行知道原理或者猜測(cè)可能,希望能講解一二 。如果是我們自定義的對(duì)象,是不能用 weak 來(lái)聲明的,編譯器會(huì)直接報(bào)錯(cuò)。

WeakHashMap:WeakHashMap與HashMap的用法基本相同,區(qū)別在于:后者的key保留對(duì)象的強(qiáng)引用,即只要HashMap對(duì)象不被銷毀,其對(duì)象所有key所引用的對(duì)象不會(huì)被垃圾回收,HashMap也不會(huì)自動(dòng)刪除這些key所對(duì)應(yīng)的鍵值對(duì)對(duì)象。

ios中strong和weak的區(qū)別

1、weak weak只能用來(lái)修飾對(duì)象,但是并不持有,引用計(jì)數(shù)不會(huì)+1。在Runtime中對(duì)該屬性進(jìn)行了操作,指向的內(nèi)存被釋放后(引用計(jì)數(shù)為0),指針就會(huì)自動(dòng)=nil,多用于避免循環(huán)引用的地方。

2、第二種:我們給控制器增加一個(gè)屬性,指向我們的子視圖。這個(gè)屬性有兩種可能,一種是strong,一種是weak。我們先來(lái)試試strong。從結(jié)果可以看出,點(diǎn)擊按鈕子視圖是移除了,但是對(duì)象沒(méi)有被銷毀。

3、weak 和strong的區(qū)別:(weak和strong)不同的是 當(dāng)一個(gè)對(duì)象不再有strong類型的指針指向它的時(shí)候 它會(huì)被釋放 ,即使還有weak型指針指向它。

4、strong和weak的區(qū)別 strong表示保留它指向的堆上的內(nèi)存區(qū)域不再指向這塊區(qū)域了。

分享題目:ios開(kāi)發(fā)weak原理 ios開(kāi)發(fā) websocket
分享網(wǎng)址:http://muchs.cn/article31/dgsocpd.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、微信公眾號(hào)、網(wǎng)站導(dǎo)航、網(wǎng)站收錄、網(wǎng)站制作標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司