ios開發(fā)數(shù)組弱引用對(duì)象 數(shù)組 引用

iOS-底層原理26:weak原理

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

我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、青龍ssl等。為數(shù)千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的青龍網(wǎng)站制作公司

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

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

iOS開發(fā)中的循環(huán)引用

1、修飾對(duì)象不會(huì)增加其引用計(jì)數(shù),避免了循環(huán)引用。 如果被修飾的對(duì)象在某一時(shí)機(jī)被釋放,會(huì)產(chǎn)生 懸垂指針 ,再通過這個(gè)指針去訪問原對(duì)象的話,會(huì)導(dǎo)致內(nèi)存泄露,所以一般不建議用,__unsafe_unretained去解除循環(huán)引用。

2、可以用weak修飾delegate。NSTimer 1首先我們聲明timer的時(shí)候,使用strong修飾的,self對(duì)timer進(jìn)行的強(qiáng)引用,如下 2創(chuàng)建timer時(shí),target對(duì)self又進(jìn)行了強(qiáng)引用 至此,循環(huán)引用已經(jīng)形成。

3、在iOS開發(fā)中,循環(huán)引用常常發(fā)生在使用Block、Delegate和通知等機(jī)制時(shí)。為了避免循環(huán)引用,可以使用weak、strong和copy等關(guān)鍵字來修飾對(duì)象,明確表達(dá)對(duì)象之間的擁有關(guān)系。

4、循環(huán)引用是iOS開發(fā)中經(jīng)常遇到的問題,它指的是兩個(gè)或多個(gè)對(duì)象通過相互之間的強(qiáng)引用,形成了一個(gè)保留環(huán),即使已經(jīng)沒有外部對(duì)象持有,也無法對(duì)其進(jìn)行釋放操作,也無法釋放其占用的內(nèi)存空間(引用計(jì)數(shù)器始終大于0)。

5、出現(xiàn)循環(huán)引用的三種情況:聲明代理delegate屬性 使用block時(shí) 使用NSTimer的時(shí)候 代理屬性導(dǎo)致循環(huán)引用。

OC中weak的原理

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

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

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

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

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

關(guān)于iOS基本屬性修飾符的理解(weak篇)

assign assign主要用來修飾基本數(shù)據(jù)類型,例如int,float,NSInteger,CGFloat,儲(chǔ)存在棧中內(nèi)存不需要管理,一般不修飾對(duì)象,不然對(duì)象內(nèi)存地址被釋放,但是指針不會(huì)釋放就會(huì)造成野指針。

在 Student 類中添加分別由 strong 、 copy 、 weak 修飾的屬性:在通過 Clang 編譯后的 .cpp 文件中,看到會(huì)生成三個(gè)對(duì)應(yīng)的 setter 方法:唯獨(dú)在 setAge 的方法調(diào)用中,是通過 objc_setProperty 方法實(shí)現(xiàn)的。

Weak+Controller是一種模式設(shè)計(jì)模式,簡稱WC模式。主要用于分離組件操作邏輯和組件控制邏輯。其中Weak表示要訪問的操作邏輯組件,它不會(huì)調(diào)用任何其它的代碼。

ARC的修飾符 ARC主要提供了4種修飾符,他們分別是:__strong,__weak,__autoreleasing,__unsafe_unretained。__strong 表示引用為強(qiáng)引用。對(duì)應(yīng)在定義property時(shí)的strong。

在@property修飾符中可以出現(xiàn)多個(gè)修飾符,分別用逗號(hào)分隔,但是,在上述修飾符中,1,2,3組中的屬性分別之恩那個(gè)出現(xiàn)一個(gè),只有4中可以同時(shí)出現(xiàn)。

你可以直接在你的類里面寫和實(shí)體類里面的屬性一樣的屬性名字就可以了 如:實(shí)體類里面有一個(gè) String name; 在你現(xiàn)在的類里面你也可以直接寫一個(gè) String name 并給他get 和set方法,但是這個(gè)意義并不大。

ios中什么是弱變量跟強(qiáng)變量

1、首先strong和weak這兩個(gè)關(guān)鍵字是用來修飾變量,表示這個(gè)變量是強(qiáng)(strong)引用和弱(weak)引用 我們?cè)诔绦蛑薪?jīng)常會(huì)用到“[[class alloc]init]” 這樣的代碼,我想你對(duì)它已經(jīng)很熟。這是在開辟一塊內(nèi)存,并初始化。

2、weak表示指向但不擁有該對(duì)象。其修飾的對(duì)象引用計(jì)數(shù)不會(huì)增加。無需手動(dòng)設(shè)置,該對(duì)象會(huì)自行在內(nèi)存中銷毀。weak表示一個(gè)指針對(duì)一塊內(nèi)存進(jìn)行弱引用。弱引用就是不增加所指向內(nèi)存的引用計(jì)數(shù)。

3、Objective-C支持包含對(duì)象的強(qiáng)弱兩個(gè)類型的變量。 在變量聲明時(shí),強(qiáng)類型的變量包含類名,弱類型的變量使用類型 id 代替對(duì)象。 弱類型變量在像集合類中使用頻繁,在一個(gè)集合中的對(duì)象的實(shí)際類型可能是未知的。

4、就是說js中變量可以被賦予不同類型的值都不會(huì)報(bào)錯(cuò)。而java中 int a = 8;就不能在對(duì)a賦值個(gè)字符串如:a= asa//這個(gè)時(shí)候java就會(huì)報(bào)編譯時(shí)錯(cuò)誤,你把一個(gè)String字符串賦值給一個(gè)int類型變量。

5、在這個(gè)對(duì)象的生命周期中,會(huì)有很多變量來指向和引用它。指向這個(gè)對(duì)象的變量也可以通過release方法來解除這種擁有權(quán)。release方法將會(huì)告訴運(yùn)行時(shí),我已經(jīng)使用完這個(gè)變量了,已經(jīng)不需要它了,retainCount計(jì)數(shù)減1。

6、弱類型的檢查很弱,僅能嚴(yán)格的區(qū)分指令和數(shù)據(jù)。強(qiáng)類型的則嚴(yán)格的在編譯期進(jìn)行檢查。JAVA是強(qiáng)類型語言;因此每個(gè)變量和對(duì)象都必須具有聲明類型。

分享文章:ios開發(fā)數(shù)組弱引用對(duì)象 數(shù)組 引用
文章位置:http://bm7419.com/article15/dgchogi.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、域名注冊(cè)App設(shè)計(jì)、企業(yè)建站外貿(mào)建站、App開發(fā)

廣告

聲明:本網(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í)需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管