2016-11-25 49 views
18

我有一點點混淆ARC引用計數可以請告訴我什麼將引用計數波紋管代碼。引用計數在ARC

var vc1 = UIViewController() 
var vc2 = vc1 
var vc3 = vc2 
weak var vc4 = vc3 

問題是什麼將是:VC1的

  • 引用計數?
  • vc2的引用計數?
  • vc3的引用計數?
  • vc4的引用計數?

回答

15

這裏,vc1,vc2,vc3涉及相同的對象。因此,該對象的引用計數爲3.當vc4引用同一個對象時,由於它是弱引用,因此引用計數不會加1.因此,之後的引用計數也將爲3

  1. 所創建和的第一行代碼後vc1稱爲UIViewController對象的引用計數是1

    var vc1:UIViewController? = UIViewController() // strong reference 
    
  2. vc2是指相同的對象vc1後。對象的引用計數變爲2

    var vc2:UIViewController? = vc1 // strong reference 
    
  3. vc3是指相同的對象vc1vc2後。對象的引用計數變爲3

    var vc3:UIViewController? = vc2 // strong reference 
    
  4. vc4是指相同的對象vc1vc2vc3後。由於vc4是弱引用,引用計數不會增加。這意味着數仍爲3.

    weak var vc4:UIViewController? = vc3 // weak reference 
    

這意味着什麼:

執行下面的代碼。

vc1 = nil; // reference count = 3-1 = 2 
    vc2 = nil; // reference count = 2-1 = 1 
    vc3 = nil; // reference count = 1-1 = 0 and object is destroyed 

現在,打印vc4的值。它將是nil。發生這種情況是因爲對象的引用計數變爲零,並且所有變量都引用同一個對象。

編輯:

在下面的代碼中使用CFGetRetainCount給出如下說明如下結果:

var vc1:NSDate? = NSDate() 
print(CFGetRetainCount(vc1)) // 2 - I expected this to be 1 as only one variable is strongly referring this object. 

var vc2:NSDate? = vc1 
print(CFGetRetainCount(vc1)) // 3 - reference count incremented by 1 (strong reference) 

var vc3:NSDate? = vc2 
print(CFGetRetainCount(vc3)) // 4 - reference count incremented by 1 (strong reference) 

weak var vc4:NSDate? = vc1 
print(CFGetRetainCount(vc1)) // 4 - reference count not incremented (weak reference) 

vc1 = nil 
print(CFGetRetainCount(vc2)) // 3 - reference count decremented by 1 (strong reference removed) 

vc2 = nil 
print(CFGetRetainCount(vc3)) // 2 - reference count decremented by 1 (strong reference removed) 

vc3 = nil 
print(vc4) // nil - reference count should be decremented by 1 (last strong reference removed) 

// Also due to the final line vc3 = nil, reference count should become zero 
// However, we can't use `CFGetRetainCount` to get reference count in this case 
// This is due to the final strong reference being removed and object getting destroyed 

爲什麼CFRetainCount在一號線給2的原因進行了討論here。感謝@CodaFi和@Sahil在評論中的討論

+0

感謝KrishnaCA您驚人的響應 –

+0

不客氣:) – KrishnaCA

+2

爲什麼CFGetRetainCount給4然後@KrishnaCA? – Sahil

1

1,2,3,4 - 引用計數爲3

時引用計數不會遞增唯一的例外 - 因爲弱4號線,變質

2

在我看來VC1至VC3增加保留計數和通過默認屬性是strong直到我們指定這些爲weak

強:強是通常由一個類來建立一個對象的所有權。它增加了保留計數(ARC爲你處理的東西),它基本上保留了內存中指向的對象,直到該類實例停止指向它爲止。這通常是你想要的,但它可能會導致一種叫做

在VC4爲你減速的情況下,weak「保留週期。」:

弱:這給一個指針對象,但不要求所有權,也不會增加保留計數。只要另一個類強烈指向它,它基本上保持一個有效的指向對象的指針。如果沒有其他人試圖保留它,弱指針會自動設置爲零。

4

您可以使用CFGetRetainCount函數檢查參考計數。

var vc1 = UIViewController() 
var vc2 = vc1 
var vc3 = vc2 
weak var vc4 = vc3 


print(CFGetRetainCount(vc1)) //4 
print(CFGetRetainCount(vc2)) //4 
print(CFGetRetainCount(vc3)) //4 
print(CFGetRetainCount(vc4)) //4 

你也可以參考這個Get Ref Count

+0

'CFGrtRetainCount'確實返回4,但你沒有回答問題。看看CodaFi的評論,看看爲什麼你的答案是不正確的 – fpg1503

+0

@Sahil,嘗試在這裏每一步獲得保留數並檢查結果。我只是試了一下。 'var vc1 = UIViewController()'之後的'vc1'的保留計數是2.請確認 – KrishnaCA

+0

http://stackoverflow.com/questions/4636146/when-to-use-retaincount – Sahil