Do properties in Objective-C 2.0 require a corresponding instance variable to be declared? For example, I'm used to doing something like this:
MyObject.h
@interface MyObject : NSObject { NSString *name; } @property (nonatomic, retain) NSString *name; @end
MyObject.m
@implementation @synthesize name; @end
However, what if I did this instead:
MyObject.h
@interface MyObject : NSObject { } @property (nonatomic, retain) NSString *name; @end
Is this still valid? And is it in any way different to my previous example?
When talking about a specific language these two can be different. For example, in C# a property is actually a function that returns an object, while an instance variable is a non-static member variable of a class.
I use properties for the interface part - where the object interfaces with other objects and instance variables are stuff that you need inside your class - nobody but you is supposed to see and manipulate those.
Instance properties are those properties that are defined inside any class and require an instance that is created with the help of the class name itself. Without creating the instance of the class, we may not be able to access these properties which are defined inside the class.
Instance variables hold values that must be referenced by more than one method, constructor or block, or essential parts of an object's state that must be present throughout the class. Instance variables can be declared at the class level before or after use.
If you are using the Modern Objective-C Runtime (that's either iOS 3.x or greater, or 64-bit Snow Leopard or greater) then you do not need to define ivars for your properties in cases like this.
When you @synthesize
the property, the ivar will in effect be synthesized also for you. This gets around the "fragile-ivar" scenario. You can read more about it on Cocoa with Love
In your interface, you can formally declare an instance variable between the braces, or via @property
outside the braces, or both. Either way, they become attributes of the class. The difference is that if you declare @property
, then you can implement using @synthesize
, which auto-codes your getter/setter for you. The auto-coder setter initializes integers and floats to zero, for example. IF you declare an instance variable, and DO NOT specify a corresponding @property
, then you cannot use @synthesize
and must write your own getter/setter.
You can always override the auto-coded getter/setter by specifying your own. This is commonly done with the managedObjectContext
property which is lazily loaded. Thus, you declare your managedObjectContext
as a property, but then also write a -(NSManagedObjectContext *)managedObjectContext
method. Recall that a method, which has the same name as an instance variable/property is the "getter" method.
The @property
declaration method also allows you other options, such as retain
and readonly
, which the instance variable declaration method does not. Basically, ivar
is the old way, and @property
extends it and makes it fancier/easier. You can refer to either using the self. prefix, or not, it doesn't matter as long as the name is unique to that class. Otherwise, if your superclass has the same name of a property as you, then you have to say either like self.name or super.name in order to specify which name you are talking about.
Thus, you will see fewer and fewer people declare ivar
s between the braces, and instead shift toward just specifying @property
, and then doing @synthesize
. You cannot do @synthesize
in your implementation without a corresponding @property
. The Synthesizer only knows what type of attribute it is from the @property
specification. The synthesize statement also allows you to rename properties, so that you can refer to a property by one name (shorthand) inside your code, but outside in the .h file use the full name. However, with the really cool autocomplete that XCode now has, this is less of an advantage, but is still there.
Hope this helps clear up all the confusion and misinformation that is floating around out there.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With