• 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
Very interesting ordering caveat with NSArray arrayWithObjects:
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Very interesting ordering caveat with NSArray arrayWithObjects:


  • Subject: Very interesting ordering caveat with NSArray arrayWithObjects:
  • From: Eric Hermanson <email@hidden>
  • Date: Fri, 03 Apr 2009 20:30:38 -0400

Some (or most) people might be aware of this caveat, but I was not, so I'll share it.

Consider this code:

NSArray *array = [NSArray arrayWithObjects:[MyCounterClass newObject], [MyCounterClass newObject], nil];

where [MyCounterClass newObject] is a static method that returns a new autoreleased instance that simply stores an incrementing int32 counter in its instance variable, e.g.

self.oid = SomeStaticCounter++; // (or ideally, OSAtomicIncrement32Barrier(&SomeStaticCounter);

Now, one would expect that the array would contain:

	element 1: MyCounterInstance.oid=1
	element 2: MyCounterInstance.oid=2

However, this is NOT the case. Either the compiler or the runtime executes the SECOND call to [MyCounterClass newObject] FIRST, so the array actually contains:

	element 1: MyCounterInstance.oid=2
	element 2: MyCounterInstance.oid=1

NSArray arrayWithObjects: is of course correctly putting the objects into the array in the correct natural ordering, but the objects are CREATED on the stack in the oppose order. Maybe most people knew that, I did not. So the (or a) workaround is:

    MyCounterClass *object1 = [MyCounterClass newObject];
    MyCounterClass *object2 = [MyCounterClass newObject];
    NSArray *array = [NSArray arrayWithObjects: object1, object2, nil];

- Eric

_______________________________________________

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: Very interesting ordering caveat with NSArray arrayWithObjects:
      • From: Uli Kusterer <email@hidden>
    • Re: Very interesting ordering caveat with NSArray arrayWithObjects:
      • From: Sherm Pendley <email@hidden>
    • Re: Very interesting ordering caveat with NSArray arrayWithObjects:
      • From: Michael Ash <email@hidden>
  • Prev by Date: Re: Error: mutating method sent to immutable object
  • Next by Date: Re: Dismissing the iPhone keyboard
  • Previous by thread: Re: Dragging anything out of a WebView into other Cocoa controls
  • Next by thread: Re: Very interesting ordering caveat with NSArray arrayWithObjects:
  • Index(es):
    • Date
    • Thread