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

Reply via email to