經(jīng)過反復(fù)研究,發(fā)現(xiàn)了錯誤的原因,并且找到解決錯誤的辦法下面我將介紹一下我的思路:(慢慢來 跟著我的思路走)
專注于為中小企業(yè)提供做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)洪雅免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了千余家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
當(dāng)這個方法執(zhí)行完之后,就會出現(xiàn)前面所展示的錯誤
為什么會出現(xiàn)這種錯誤呢????其實(shí)出現(xiàn)這種錯誤也很簡單的:
首先在buttonAction 這個方法內(nèi),secondVC 他是一個局部變量,現(xiàn)在是ARC 管理,當(dāng)這個方法執(zhí)行完成以后,會銷毀 secondVC 這個對象,那么,很自然的就會調(diào)用 SecondViewController 里面的 dealloc 這個方法【也就是第三步的方法,請看第三步】
根據(jù)錯誤提示,appDelegate 的屬性kvoState 會被remove,但是的這個時候, it is not registered as an observer ,所以,就會出現(xiàn)上述的崩潰現(xiàn)象說了這么多,大家能理解這個崩潰的原因了嗎?(PS:不懂的話也請繼續(xù)了解下面的內(nèi)容)
總之就是:有時候我們會忘記添加多次KVO監(jiān)聽或者,不小心刪除如果KVO監(jiān)聽,如果添加多次KVO監(jiān)聽這個時候我們就會接受到多次監(jiān)聽。如果刪除多次kvo程序就會造成catch既然問題的出現(xiàn),那么,肯定會伴隨著事務(wù)的解決
下面我講給大家講解幾個解決的方法(百度查資料的,親自驗(yàn)證,安全可靠),
那么iOS開發(fā)-黑科技防止多次添加刪除KVO出現(xiàn)的問題
上述方法基本可以解決這個崩潰的問題,那么有沒有更好的方法 解決同類 的問題呢?
對已經(jīng)學(xué)會的知識,不斷地總結(jié),可以讓你變得更強(qiáng)的。
什么情況下會調(diào)用kvo。
什么情況下不會調(diào)用kvo。
kvo的底層原理實(shí)現(xiàn)。
我們對name,哪些會真正的觸發(fā)kvo呢
我可以告訴你,1 2 4 6會監(jiān)聽到kvo的變化,而其他的則檢測不到。
又比如下面這個例子。
當(dāng)我們對animal進(jìn)行kvo監(jiān)聽,然后修改name的值,是否會被kvo監(jiān)聽到。
當(dāng)我們對personclass對象重新賦值一個AnimalClass對象,是否會被kvo監(jiān)聽到。
我可以告訴你,第一種情況是監(jiān)聽不到的,第二種情況是可以監(jiān)聽到的。
然后,為什么呢?
我這里有兩張圖片。
當(dāng)我們對一個對象進(jìn)行kvo監(jiān)聽的時候,會生成一個NSKVONotifying_前綴的類,然后我們實(shí)際的操作是對這個類進(jìn)行的。
通俗的講,對對象的進(jìn)行kvo監(jiān)聽后,這個對象的isa指針已經(jīng)指向了NSKVONotifying_前綴的類,NSKVONotifying_Person。這個類是person的子類,他的superclass就是person類對象。
我們在調(diào)用setage方法的時候,會根據(jù)對象的isa找到NSKVONotifying_Person,然后在他的類里面找setage的實(shí)現(xiàn)。
那么有沒有疑惑,setage中到底做了什么操作呢?
_NSsetIntValueAndNotify記住這個函數(shù)。
我們可以這樣打印出setage的方法實(shí)現(xiàn)。
可以打印出
這個_NSsetIntValueAndNotify方法就是setage的實(shí)現(xiàn),具體的實(shí)現(xiàn),請?jiān)偻罂础?/p>
Foundation框架中還有很多例如_NSSetBoolValueAndNotify、_NSSetCharValueAndNotify、_NSSetFloatValueAndNotify、_NSSetLongValueAndNotify等等函數(shù)。
繼續(xù)往下看。
打印結(jié)果如下
在kvo監(jiān)聽下,包含了四個方法,setAge: class dealloc _isKVOA
我們先從clas來進(jìn)行入手。
打印結(jié)果都是person。為什么呢?
進(jìn)行kvo監(jiān)聽之后,不是進(jìn)行變?yōu)镹SKVONotifyin_Person這個類嗎?怎么打印出來都是person。
其實(shí)是蘋果不希望將這個NSKVONotifyin_Person暴露出來。然后在類的內(nèi)部,重寫了clas方法。
setAge方法的再深一層的內(nèi)部實(shí)現(xiàn)?
我相信看完都會有所收獲。
看完這些最開始的例子,我覺得會懂了。
我們來看下kvc的原理:
觸發(fā)kvc的set方法才可以觸發(fā)kvo機(jī)制。
所以這兩種情況
在開發(fā)過程中,不管是出于什么需求,有的時候(自我感覺比較少)就可能會遇到監(jiān)聽數(shù)組元素的變化,來做一些響應(yīng)的操作
首先,iOS默認(rèn)不支持對數(shù)組的KVO,因?yàn)槠胀ǚ绞奖O(jiān)聽的對象的地址的變化,而數(shù)組地址不變,而是里面的值發(fā)生了改變,所以我們需要做一些響應(yīng)的處理,讓監(jiān)聽數(shù)組和監(jiān)聽一個類的屬性一樣。
.m
現(xiàn)監(jiān)聽方法:
我在 AppDelegate 中監(jiān)聽的,故省去。
以上就可以實(shí)現(xiàn)了對一個數(shù)組的監(jiān)聽,在需要引入的地方,實(shí)現(xiàn)即可。
最后,數(shù)組的添加刪除,就不能用一定不要用 addObject: 和 removeObject: 方法了,那樣肯定會崩潰的,而要用:
這樣就可以實(shí)現(xiàn)對數(shù)組元素的變化進(jìn)行監(jiān)聽達(dá)到想要的效果而不崩潰。
分享文章:ios開發(fā)kvo,iOS開發(fā)kvo
瀏覽路徑:http://aaarwkj.com/article2/dsspdic.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、關(guān)鍵詞優(yōu)化、網(wǎng)頁設(shè)計(jì)公司、定制網(wǎng)站、企業(yè)建站、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)