iOS代理不回撥的6種原因
關於代理不回撥問題, 以下按照腦殘級別排序:
>
1. 沒有設定代理 XXX.delegate = self
2. 方法名寫錯
3. 新方法得判斷iOS版本
4. 引用物件被釋放了
5. 具體功能info.plist配置錯誤
6. 在block中設定有時會出現代理不回撥問題(用通知代替)
錯誤1,2 :
對於錯誤1,2一般是很新的新手或者老手腦袋短路極不正常時犯的錯誤.具體就不討論了(也沒什麼好討論的��).
錯誤3 :
這個錯誤一般也可以忽略,因為使用高階API程式直接會崩潰.
錯誤4 :
引用物件唄釋放了:
這個錯誤較之於上面三個有點難度,解決這個錯誤需要對記憶體管理有所瞭解.如果記憶體管理不好,這裡也很容易出現EXC_BAD_ACCESS崩潰.所以檢查物件的生命週期,代理要設定成全域性變數,不要設定成區域性變數.
代理設定使用weak,避免造成迴圈引用.而且要在dealloc方法中將代理設定為nil.
* 注意: 不要使用assign,因為assgin型別在使用結束後不會設定成nil,此時發訊息的話會EXC_BAD_ACCESS.
錯誤5 :
這個問題是在處理特定功能時才能遇到的,不具有普遍性.比如使用CLLocationManager獲取地理位置時不進代理的回撥.你代理明明設定的很清楚,也遵循代理了,物件也沒有被釋放,但是代理就是不進,是不是很迷惑很糾結��. 此時代理不進的另一個原因就是info.plist沒有配置正確.
因為獲取地理位置需要配置info.plist的屬性: NSLocationAlwaysUsageDescription 或者NSLocationWhenInUseUsageDescription.
錯誤6 :
關於這個問題是我徒弟遇到的,具體什麼需求可以以後討論一下,如果大家也遇到這個問題,這裡可以作為一個小參考.