我對塊的弱引用有一個基本的理解。我現在面臨的問題是,瞭解保留訪問自己內部的塊的計數。
每當我訪問塊內自我,在保持自我的數量得到增加,在那裏,當我訪問默認塊(例如UIViewAnimation)保留計數內部自我自被增加1
只是想了解爲什麼它是事先得到增加2
謝謝!
我對塊的弱引用有一個基本的理解。我現在面臨的問題是,瞭解保留訪問自己內部的塊的計數。
每當我訪問塊內自我,在保持自我的數量得到增加,在那裏,當我訪問默認塊(例如UIViewAnimation)保留計數內部自我自被增加1
只是想了解爲什麼它是事先得到增加2
謝謝!
在塊內使用自我通常會創建一個循環,這可能是其增加2倍的原因。要解決此問題,您應該嘗試使用弱自我。檢查這個問題了
capturing self strongly in this block is likely to lead to a retain cycle
使用這樣的
__unsafe_unretained的typeof(個體經營)weakSelf =自我;
在塊內使用'self'不會創建一個循環。它從塊創建一個引用到'self'。如果您創建一個循環,它只會創建一個循環 - 如果您從「self」保留對該塊的引用。這不是這裏發生的事情。 – newacct
根據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對象。
該塊將想要保留'捕獲'iVars(如自我)以確保引用保持有效......即「self」在執行前不會釋放。你會發現這裏的好信息(MRC和ARC的不同治療方法)。http://stackoverflow.com/questions/19227982/using-block-and-weak – YvesLeBorg
也爲了更好地理解弱閱讀https://dhoerl.wordpress。 com/2013/04/23/i-finally-figured-out-weakself-and-strongself/ –
http://whentouseretaincount.com – jrturton