i met similar question in swift memory management: storing func in var didn't solve problem.
here class definition:
class test { var block: (() -> int)? func returnint() -> int { return 1 } deinit { print("test deinit") } }
i tried 2 ways assign value block
property , got different result. second approach didn't cause retain circle, quite unexpected:
var t = test() // lead retain cycle // t.block = t.returnint // thought lead retain cycle didn't t.block = { return t.returnint() } t = test()
in opinion, variable t
captured block
while block
property of t
, can explain why there isn't retain cycle?
in swift, captured variables captured reference (in apple blocks terminology, captured local variables __block
). t
inside block shared t
outside block; block not hold independent copy of t
.
originally, there retain cycle in second case too, block holds reference shared copy of t
, , t
points first test
object, , test
object's block
property points block. however, when re-assign shared variable t
(which visible both inside , outside block), break retain cycle, because t
no longer points first test
object.
in first case, t
captured value, because t
evaluated in expression t.returnint
rather captured variable in block. reassignment of t
outside block later has no effect on block, , not break retain cycle. can think of
t.block = t.returnint
as kind of like
let tmp = t t.block = { return tmp.returnint() }
Comments
Post a Comment