[LLVMdev] Error prone default memory capturing convention of blocks.
Jim Grosbach
grosbach at apple.com
Tue Oct 2 10:26:56 PDT 2012
Hello,
Most of the front-end language types hang out in cfe-dev, so you're more likely to get a response there. I've CCed that list, so no need to re-send.
-Jim
On Oct 2, 2012, at 8:35 AM, Iaroslav Pavlov <iaroslav.pavlov at gmail.com> wrote:
> Hi guys,
>
> I've been using blocks for a while and found that current behavior is error prone. So I am going to propose to you the better one.
>
> Motivation:
>
> 1) The __weak variables in blocks are very common pattern. So having any implicit default behavior makes thing worse.
> 2) Some stupid mistakes like:
>
> __weak typeof (self) theSelf = self;
>
> ...^ {
> theSelf.blabla = ..
> ....
>
> [self blabla]; // ups, calling self directly is an error
> _ivar = … // or implicit call to self.
> }
>
> Retain cycles are very hard to find. I am not saying about trivial ones, that compiler can find, or the Leaks tool. Recently I have 3 retain cycles in my program, no one appeared in Leaks. So the main point is prevent such errors at first place, not to rely on that tool will find it.
>
> Proposition:
>
> Any variable captured in block must have explicit qualifier to specify memory capturing semantic: __retain, __weak, __unsafe_unretained. Qualifier is obligatory, no defaults allowed.
>
> Code will look something like this:
>
> 1)
> NSString* theLocalVariable = …
>
> ...^ {
> ...
> __weak self;
> self.blabla = ...
> …
>
> [self blabla:(__retain theLocalVariable)];
> }
>
> 2)
> {
> self.blabla = … // compile error: missing memory capture semantic qualifier.
> ....
> }
>
> For __block qualifier I propose to leave old behavior (leave the default __retain semantic), because retain cycles with write-to variables are uncommon.
>
> Regards,
> Yaroslav.
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121002/7f6cf897/attachment.html>
More information about the llvm-dev
mailing list