//OBJC_ASSOCIATION_ASSIGN類似於我們常用的assign,assign策略的特點就是在對象釋放以後,不會主動將應用的對象置為nil,這樣會有訪問僵屍對象導致應用崩潰的風險。為瞭解決這個問題:我們可以創建一個替身對象,以OBJC_ASSOCIATION_RETAIN_NONATO ...
//OBJC_ASSOCIATION_ASSIGN類似於我們常用的assign,assign策略的特點就是在對象釋放以後,不會主動將應用的對象置為nil,這樣會有訪問僵屍對象導致應用崩潰的風險。為瞭解決這個問題:我們可以創建一個替身對象,以OBJC_ASSOCIATION_RETAIN_NONATOMIC 的策略來強引用替身對象,然後在對象中以weak的策略去引用我們真實需要保護的對象。這樣就能解決這個可能導致崩潰的問題了。
//結論:將OBJC_ASSOCIATION_ASSIGN改為OBJC_ASSOCIATION_RETAIN,這樣在本對象有一個強引用,這個被關聯的對象也就不會被釋放,生命周期也和本對象相同了。我認為既然關聯對象傳入的都是對象,那麼其實絕大多時候用的應該是OBJC_ASSOCIATION_RETAIN,在我們項目中傳入的對象很多是NSNumber類型(包裝的bool或則int)的時候都是用的OBJC_ASSOCIATION_ASSIGN,以前沒暴露問題也是誤打誤撞錯進錯出。所以除了一些需要破解迴圈引用的場景,關聯對象的記憶體操作修飾符建議都用OBJC_ASSOCIATION_RETAIN