• 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: Updating tracking areas Rect
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Updating tracking areas Rect


  • Subject: Re: Updating tracking areas Rect
  • From: Graham Cox <email@hidden>
  • Date: Tue, 29 Dec 2009 13:41:09 +1100

On 29/12/2009, at 1:03 PM, Henry McGilton (Boulevardier) wrote:

>> Wouldn't this fall foul of the usual problem with deleting items from the collection being iterated, in that it will skip every other object? (Or perhaps fast enumeration has a built-in protection against that?)
>
> Yes, fast enumeration specifically states:
>
> 	• Enumeration is “safe”—the enumerator has a mutation guard so that if you attempt to modify the collection during enumeration, an exception is raised.
> And also:
>
>         Since mutation of the object during iteration is forbidden, you can perform multiple enumerations concurrently.
>

So, if -trackingAreas returns the actual array (rather than a copy), and -removeTrackingArea: is basically a wrapper for -removeObject: on that same array then the loop will fail with this exception. Since we don't know if either of these things are true, then the loop as written will either fail, or depend upon implementation details which could change for its success.

However that's a different problem from the one I mentioned, where a forward iteration of an array that removes the indexed item will end up skipping every other object. Iterating a copy of the array will avoid that, so I was wondering if fast enumeration operated on a copy internally. I'm thinking 'no', since a) it wouldn't be so fast, b) there would be no need for the exception you mention and c) there are plenty of cases where a copy is undesirable or unnecessary.

So however you look at it, the suggested replacement for the original faulty loop is just as faulty.

I'd just go with:

while([[self trackingAreas] count] > 0 )
    [self removeTrackingArea:[[self trackingAreas] lastObject]];


--Graham


_______________________________________________

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

  • Follow-Ups:
    • Re: Updating tracking areas Rect
      • From: Quincey Morris <email@hidden>
    • Re: Updating tracking areas Rect
      • From: Joar Wingfors <email@hidden>
References: 
 >Updating tracking areas Rect (From: Gustavo Pizano <email@hidden>)
 >Re: Updating tracking areas Rect (From: Gustavo Pizano <email@hidden>)
 >Re: Updating tracking areas Rect (From: Joar Wingfors <email@hidden>)
 >Re: Updating tracking areas Rect (From: Graham Cox <email@hidden>)
 >Re: Updating tracking areas Rect (From: "Henry McGilton (Boulevardier)" <email@hidden>)

  • Prev by Date: Re: Updating tracking areas Rect
  • Next by Date: Re: Updating tracking areas Rect
  • Previous by thread: Re: Updating tracking areas Rect
  • Next by thread: Re: Updating tracking areas Rect
  • Index(es):
    • Date
    • Thread