On Dec 28, 2009, at 3:27 PM, Graham Cox wrote: > > On 29/12/2009, at 4:00 AM, Joar Wingfors wrote: > >>> NSInteger i = 0; >>> while ([[self trackingAreas] count]==0) { >>> [self removeTrackingArea:[[self trackingAreas] >>> objectAtIndex:i]]; >>> i++; >>> } >> >> >> That loop seems all kinds of wrong... ;-) >> >> How about: >> >> for (NSTrackingArea *trackingArea in [self trackingAreas]) { >> [self removeTrackingArea:trackingArea]; >> } > > > 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. > > The first loop is also wrong in that its terminating condition is backwards > (should be >0) as well as having the skip every other object problem. If you > want to remove items from the collection being iterated, you should copy the > collection temporarily and iterate that or iterate it by index backwards. > Cheers, . . . . . . . . Henry ================================================= iPhone App Development and Developer Education . . . Visit www.nonatomic-retain.com Mac OSX Application Development, Plus a Great Deal More . . . Visit www.trilithon.com _______________________________________________ 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: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com