2015-01-02 22 views
4

我對塊的弱引用有一個基本的理解。我現在面臨的問題是,瞭解保留訪問自己內部的塊的計數。

每當我訪問塊內自我,在保持自我的數量得到增加,在那裏,當我訪問默認塊(例如UIViewAnimation)保留計數內部自我自被增加1

只是想了解爲什麼它是事先得到增加2 enter image description here

謝謝!

+0

該塊將想要保留'捕獲'iVars(如自我)以確保引用保持有效......即「self」在執行前不會釋放。你會發現這裏的好信息(MRC和ARC的不同治療方法)。http://stackoverflow.com/questions/19227982/using-block-and-weak – YvesLeBorg

+1

也爲了更好地理解弱閱讀https://dhoerl.wordpress。 com/2013/04/23/i-finally-figured-out-weakself-and-strongself/ –

+5

http://whentouseretaincount.com – jrturton

回答

-1

在塊內使用自我通常會創建一個循環,這可能是其增加2倍的原因。要解決此問題,您應該嘗試使用弱自我。檢查這個問題了

capturing self strongly in this block is likely to lead to a retain cycle

使用這樣的
__unsafe_unretained的typeof(個體經營)weakSelf =自我;

+0

在塊內使用'self'不會創建一個循環。它從塊創建一個引用到'self'。如果您創建一個循環,它只會創建一個循環 - 如果您從「self」保留對該塊的引用。這不是這裏發生的事情。 – newacct

1

根據Clang生成Objective-C塊代碼的源代碼。

Objective-C的塊字面由EmitBlockLiteral函數生成。

llvm::Value *CodeGenFunction::EmitBlockLiteral(const CGBlockInfo &blockInfo) { 

LLVM document解釋深深什麼是塊文字。無論如何,這個函數會生成指定塊的塊描述符和複製幫助函數。複製助手功能用於捕捉自動變量和self

buildBlockDescriptor -> buildCopyHelper -> GenerateCopyHelperFunction 

GenerateCopyHelperFunction功能,鏘發射objc_storeStrong用於將由塊被捕獲的每個目標C對象自動變量。

for (const auto &CI : blockDecl->captures()) { 
    ... 
    EmitARCStoreStrongCall(... 

所以,這條線會計算保留計數爲self(1 - > 2)。

之後,EmitBlockLiteral函數也爲每個Objective-C對象自動變量發出objc_retain,該自動變量也將由該塊捕獲。

// Next, captured variables. 
for (const auto &CI : blockDecl->captures()) { 
    ... 
    EmitExprAsInit -> EmitScalarInit -> EmitARCRetain 

因此此線將向上計數的self保留計數太(2 - > 3)。

我不知道確切的原因。但顯然,在塊副本助手函數捕獲對象之前,有一些理由保留Objective-C對象。