Re: How to implement readonly property
Re: How to implement readonly property
- Subject: Re: How to implement readonly property
- From: Tom Davie <email@hidden>
- Date: Mon, 12 Nov 2012 13:44:21 +0000
On 12 Nov 2012, at 13:39, Marco Tabini <email@hidden> 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 (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