因為https://blog.csdn.net/urdfmqcul2/article/details/78788962
,博客搬家至https://juejin.im/user/59fd6315f265da4321536990
兩個問題都出現在iOS 9上,用戶比例大概是在10%左右,還是占了比較大的比例,但我們平時開發所使用的測試機和模擬器都是iOS 10,同時這兩個問題出現的場景需要較多的條件,于是問題就這么漏過去了。
1.TTTAttributedLabel的text中包含emoji會引發內存溢出.
https://github.com/TTTAttributedLabel/TTTAttributedLabel/issues/601
上面是這個問題的issue,具體就不分析了,解決辦法和原因都在issue里,只是發現這個問題的過程實在太過曲折——運營那邊不停在向我們抱怨用戶反饋crash,可是fabric上真的干凈得如一張白紙(其實也不太干凈)啊。
2.UICollectionView dataSource is not set.
iOS9中,UICollectionView removeFromSuperView時,會調用DataSource中的一些方法,此時如果DataSource已經釋放,就會出現上圖中的crash。iOS 10中UIKit中對這部分邏輯做了改動,因此不會crash了。
而造成DataSource會被提前釋放的很大可能原因就是,在構造UICollectionView的實例時,UICollectionView的superView與DataSource生命周期不一致。舉例說:在A類中創建了UICollectionView和BView的實例,同時把UICollectionView加入了BView的subviews,但是DataSource設置為了A類,如果A的生命周期比BView要長,那就不會有問題,但是如果A在BView前先被析構了,就會引發crash。
解決辦法,在A的dealloc中將UICollectionView提前removeFromSuperView。