Re: Stupid Cocoa question. How can you tell if the object you are looking at is a property or an ivar?
Re: Stupid Cocoa question. How can you tell if the object you are looking at is a property or an ivar?
- Subject: Re: Stupid Cocoa question. How can you tell if the object you are looking at is a property or an ivar?
- From: Jens Alfke <email@hidden>
- Date: Wed, 20 May 2015 13:35:11 -0700
> On May 20, 2015, at 1:04 PM, Alex Zavatone <email@hidden> wrote:
>
> Many times in the classes, an ivar is defined in the @interface of the class. Sometimes not.
In the old days, before about 2006, the ivars had to be defined in the @interface. Nowadays it’s best to put them in the @implementation since they’re private to the implementation anyway. I always move them when updating old code.
> Now, I remember back in 2012 that I could access a property within an instance of the object without using self, but never knew if I was accessing the ivar or the property itself simply by looking at the object.
It’s simple, really:
• “foo” is a variable — either an ivar or some sort of C variable (local, parameter, static, global.)
• “self.foo” is a reference to a property. It’s equivalent to “[self foo]”, or if it’s on the left-hand-side of an assignment it’s “[self setFoo: …]”.
There’s no ambiguity at all. A property name _has to_ go after a “.”, with an object value beforehand. An instance variable _cannot_ go after a “.” (It’s possible to refer to an ivar as “self->foo” but that syntax is old-fashioned and discouraged AFAIK.)
Ivars and properties have entirely different namespaces, so even if a property has a backing ivar (i.e. is synthesized) the names don’t have to relate to each other. If you don’t explicitly use @synthesize, then I believe the ivar names created by the compiler will be the property name prefixed with “_”.
I’m strongly against auto-synthesis; I think it was a bad idea to add it to Clang. It may save you from having to type “@synthesize”, but it leads to a lot of confusion, as shown here, by blurring the distinction between properties and ivars and creating ivars out of nowhere. And it can cause bugs if you meant a property to have explicit get or set methods but forgot to implement them (or worse, misspelled them!) I always turn it off in the target settings of my projects.
—Jens
_______________________________________________
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