On Feb 18, 2012, at 9:23 AM, Fritz Anderson wrote:
> On 18 Feb 2012, at 7:41 AM, steven Hooley wrote:
>> Matt Neuburg wrote:
>>> The same issue came up again later the same day:
>>> 
>>>  __block UIBackgroundTaskIdentifier bti = [[UIApplication sharedApplication]
>>>                                  beginBackgroundTaskWithExpirationHandler: 
>>> ^{
>>>      [[UIApplication sharedApplication] endBackgroundTask:bti];
>>>  }];
>>> 
>>> Without __block, bti is invalid, and you won't find that out easily because 
>>> it's unlikely that you'll actually expire. :) m.
>> 
>> Can this be right?
> 
> If I understand why you're mystified, consider this, without the __block 
> declaration.
> 
> - bti starts as junk.
> 
> - The block is instantiated, and captures the junk _value_ (because it's not 
> a __block variable) of bti.
> 
> - The beginBackgroundTask… method creates the background task identifier.
> 
> - That identifier is then assigned to bti. bti is no longer junk, but that 
> does the block no good, because it's already captured the junk value.

Precisely. clang now warns about this case (or will soon; I don't know which 
release of Xcode has this).

test.m:9:33: warning: variable 'x' is uninitialized when captured by block 
[-Wuninitialized]
    id x = [Foo methodWithBlock:^{ return x; }];


-- 
Greg Parker     gpar...@apple.com      Runtime Wrangler



_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to