Re: __block __weak - am I doing this right?
Re: __block __weak - am I doing this right?
- Subject: Re: __block __weak - am I doing this right?
- From: steven Hooley <email@hidden>
- Date: Sat, 18 Feb 2012 18:39:55 +0000
Thanks, I'm just surprised that this common, often cited example is broken.
http://books.google.co.uk/books?id=bwQY3_5FMg8C&pg=PA775&lpg=PA775&dq=beginBackgroundTaskWithExpirationHandler&source=bl&ots=aMuw5-hiP6&sig=NFKFDhaPw41KnfOo1n7Z_OaJflM&hl=en&sa=X&ei=T-s_T76JEaOl0AW0y-iPDw&ved=0CGoQ6AEwCTgK#v=onepage&q=beginBackgroundTaskWithExpirationHandler&f=false
That's an awful lot of broken code.
On 18 February 2012 17:23, Fritz Anderson <email@hidden> wrote:
> 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 (email@hidden)
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:
This email sent to email@hidden