You can use dispatch_sync. The blog post of oliver dobnigg (cocoanetics) summs that up quite nicely: http://www.cocoanetics.com/2012/02/threadsafe-lazy-property-initialization/
Cheers, Jörg On Nov 12, 2012, at 2:44 PM, Tom Davie <tom.da...@gmail.com> wrote: > > 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/j_simon%40mac.com > > This email sent to j_si...@mac.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: https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com