ios - weak variable with a strong reference in a block: does not create a retain cycle? -


why work when pass weak reference strong reference inside block? if local variable in block retained, should add retain self , create bad retain cycle?

here example :

__weak id weakself = self;  [self.operationqueue addoperationwithblock:^{     nsnumber* result = findlargestmersenneprime();     [[nsoperationqueue mainqueue] addoperationwithblock:^{          myclass* strongself = weakself;          strongself.textlabel.text = [result stringvalue];     }];  }]; 

when create or copy block (it copied when you, example, schedule gcd), referenced variables captured (unless declared __block specifier). strong references retained, weak references not.

when create local strongself variable keeps self alive while block executes (i.e. while it's not executed , sits in property there's no strong reference). when reference self directly - self captured , retained, keeps self while block alive.

__weak id weakself = self;  [self.operationqueue addoperationwithblock:^{     nsnumber* result = findlargestmersenneprime();     [[nsoperationqueue mainqueue] addoperationwithblock:^{           myclass* strongself = weakself; // strong reference when block executes         [self foo]; // strong reference when block created/copied          strongself.textlabel.text = [result stringvalue];     }];  }]; 

see difference? if kill strong pointers object direct self reference there still 1 strong reference inside block, 1 captured , retained. @ same time local strongself pointer holds strong reference self while block executed, so, if self dead, weakself nil , strongself nil value.


Comments

Popular posts from this blog

c++ - QTextObjectInterface with Qml TextEdit (QQuickTextEdit) -

javascript - angular ng-required radio button not toggling required off in firefox 33, OK in chrome -

xcode - Swift Playground - Files are not readable -