On 12 Nov 2012, at 13:39, Marco Tabini <mtab...@me.com> wrote: >> This is completely the wrong way to implement a property. The static >> variable will be shared between all instances. Here's how you should be >> doing a lazy loaded var: >> >> @implementation MyClass >> { >> NSDictionary *_someDictionary >> } >> >> - (NSDictionary *)someDictionary >> { >> static dispatch_once_t justOnce; >> dispatch_once(&justOnce, ^ >> { >> someDictionary = [[NSDictionary alloc] initWithObjectsAndKeys: …… >> nil]; >> }); >> return someDictionary; >> } > > I don't think this does what you think it does; my understanding is that > dispatch_once will execute only once for the lifetime of an app, so the code > you posted will only run once for the first object that requires is, and then > never run again, resulting in _dictionary being Nil in all other instances.
Very good point! My bad. > I understood the OP's request as wanting to implement a singleton, which, > based on your reading, may not be the case. dispatch_once will be fine for a > singleton, but if you need a thread-safe, lazily-instantiated read-only > property, maybe something like this will do the trick: I'm pretty sure he doesn't want a singleton, as he was talking about a property. And yeh, sorry about the misinformation there! > > @implementation MyClass { > NSDictionary *_someDictionary > } > > - (NSDictionary *) someDictionary { > @synchronized(self) { > if (!_someDictionary) { > _someDictionary = [[NSDictionary alloc] initWith… ] > } > } > > return _someDictionary; > } _______________________________________________ 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: https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com