• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Threaded drawing
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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


References: 
 >Threaded drawing (From: Graham Cox <email@hidden>)
 >Re: Threaded drawing (From: Graham Cox <email@hidden>)
 >Re: Threaded drawing (From: Graham Cox <email@hidden>)
 >Re: Threaded drawing (From: email@hidden)
 >Re: Threaded drawing (From: Seth Willits <email@hidden>)

  • Prev by Date: Re: Threaded drawing
  • Next by Date: Re: Threaded drawing
  • Previous by thread: Re: Threaded drawing
  • Next by thread: Re: Threaded drawing
  • Index(es):
    • Date
    • Thread