On 18 Feb 2012, at 7:41 AM, steven Hooley 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.


If bti is declared __block, the block captures (notionally) a _reference_ to 
bti. It doesn't evaluate bti until it executes, which will be after the 
assignment.

        — F


_______________________________________________

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