2017-09-16 70 views
1

系統類是使用引用自身的委託進行子類化的。是否必須在釋放其實例並將其引用到自身時將委託設置爲零?

class MyScrollView: UIScrollView { 
    convenience init() { 
    delegate = self 
    } 

    // Is this necessary? 
    deinit { 
     delegate = nil 
    } 
} 

是否UIScrollView.delegate財產已被重新分配的情況下,當設置爲nil?

+1

您的標題和最後一句提問兩個不同的問題。你問這兩個,或兩者中的哪一個? – Alexander

+0

@Alexander標題已更改。 – Manuel

+0

'UIScrollView'的'delegate'屬性聲明爲'weak'。你在哪裏看到'unsafe_unretained'? – rmaddy

回答

0

只有強引用才能保持活動狀態。一個弱的參考,如這個delegate成員不足以導致強烈的參考週期。這需要......強有力的參考。

另一方面,delegate = nildeinit沒有多大意義。即使delegate成員保持這個實例活着(不是),那麼這個deinit不會被首先調用。在

+0

嗨,說實話我有一個類似的問題,我現在很困惑,因爲在從蘋果(MapKit)的文檔(https://developer.apple.com/documentation/mapkit/mkmapviewdelegate如果發現強大的意見從蘋果公司將代表設置爲無 –

+0

@Hardy_Germany首先,蘋果公司正在談論一般情況,而不是'self'是'委託人'的情況,另外,*設置'nil'的微妙好處是一個委託字段在當前的實現中,沒有強引用但是存在弱引用的對象保持活動狀態,直到通過弱引用對它們進行下一次訪問,手動設置它們爲「nil」可能會加速這個釋放過程 – Alexander

+0

好,好要知道,非常感謝! –

1
// Is this necessary? 
deinit { 
    delegate = nil 
} 

設定值nil斯威夫特的deinit是永遠,永遠必要的(任何你覺得它在做什麼會被自動ARC反正完成)。還有很多其他原因,在這種情況下這不是必要的,但事實證明,這個deinit從來都不是正確的,Swift勝過了它們。

這與您的問題的標題無關;我不知道爲什麼這是標題。

+0

然後我將UIScrollView的代理設置爲nil,當釋放包含'UIScrollView'的實例時,例如'UIViewController'? – Manuel

+0

我不明白你爲什麼要這麼做。你是指代表本身消失的意思嗎? (這可以是保存滾動視圖的對象,但它不一定是。)如果scrollview的所有者是委託,那麼在代理的deinit中調用'scrollView.delegate = nil'是正確的'(但在滾動視圖的'deinit'中沒有任何意義) –

+0

UIScrollView的委託是'unsafe_unretained',它應該在釋放委託對象時儘管用ARC手動設置爲nil。 – Manuel

相關問題