Re: Threaded drawing
Re: Threaded drawing
- Subject: Re: Threaded drawing
- From: John McCall <email@hidden>
- Date: Fri, 06 Dec 2013 10:52:02 -0800
On Dec 6, 2013, at 9:24 AM, Seth Willits <email@hidden> wrote:
> On Dec 6, 2013, at 8:05 AM, email@hidden wrote:
>>>> On 6 Dec 2013, at 11:26 am, Graham Cox <email@hidden> wrote:
>>>>
>>>> NSBlockOperation* op = [NSBlockOperation blockOperationWithBlock:^
>>>> {
>>>> CGContextClipToRect( ncx, tileRect );
>>>>
>>>> [self drawTile:tileRect inContext:ncx];
>>>> }];
>>>
>>>
>>> A question for blocks experts:
>>>
>>> Is the value of <tileRect> here captured when the block is created,or when it is run?
>>>
>>> If the latter, it’s going to be probably wrong most of the time, so how can I make sure it is captured when the block is created?
>>>
>>
>>
>> It's the latter IIRC
>> You'll want to capture it outside and prefix it to be block scoped.
>
> No it’s not and no you don’t.
To expand on this, whenever you evaluate a block literal expression that uses one or more normal local variables, those variables are immediately copied into the block, essentially as if the block literal were a struct with a field that looks exactly like the local variable. When you copy the block and it has to “move" to the heap, the exact same structure gets allocated there and member-by-member copied from the stack version. Any subsequent changes to the variable aren’t tracked, because how could they be?
A __block variable is special; when you capture a __block variable, what’s actually captured is a pointer to the __block variable’s byref struct. I’ve seen a lot of confusion and over-use of __block variables, which can probably be traced back to the name being somewhat misleading. You don’t need to make a __block variable just to capture something in a block. You need to make a __block variable only if it’s important to you that the block and the enclosing function are working on the same variable, not just the same value; that is, if you’re going to modify the variable in one place and need those modifications to be seen by the other. The usual use case is a block that’s supposed to set some variable in the enclosing scope, but you could also imagine a function running a state machine and a long-lived block that’s supposed to react to state changes.
John.
_______________________________________________
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