Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Need explanation on @property/@synthesize in iOS

Not a complete noob I am quite new to iOS programming and to Ojbective-C. I mainly come from a background of C (DSP, Microcontrollers), Delphi XE2/Pascal , Visual Basic and Java (desktop and Android apps).

I mainly learned Cocoa with the book "Beginning iOS 5 Development", from Apress.

Recently I watched videos of the WWDC 2012 and went through some of their sample code, and I must say that I am confused of what is the proper way of writing my apps and more specifically with the @property/@synthesize words.

In the book most (not to say all) of the sample code uses to define a property as for example

ViewController.h @property (strong, nonatomic) NSMutableArray *list;  ViewController.m @synthesize list; 

then all the code access synthesize list with

self.list 

or even simply

list 

Now in every WWDC code sample I read I see that programmers define a property but then, in the .m file they do things like

@synthesize list = _list; 

and access sometimes

self.list 

or

_list 

I am confused. What is the correct practice ? As Apple programmers all use underscore I think I should do it that way but why the book did not ? Is there a difference between list and _list ? And more over, as I am in the same object why sometime use self.list and sometimes list/_list.

Sometimes they don't use @synthesize, I assume it's when they want to re-write their own accessors and mutators (which is never my case up to now).

I have read here and there on the web but nothing was clear enough to set my mind right, so I count on StackOverflow to bring light here.

Last but not least I prefer and answer based on current iOS 6 best practice/programming technique. Useless to tell me how to do it correctly in older iOS.

like image 481
HpTerm Avatar asked Oct 29 '12 11:10

HpTerm


People also ask

What is synthesize in IOS?

If you explicitly synthesize a property with the @synthesize keyword, then the compiler will do something similar but slightly different. If your @synthesize statement doesn't explicitly associate an instance variable name with the property, then it will use a variable name without a leading underscore.

What is synthesis property?

@synthesize creates a getter and a setter for the variable. This lets you specify some attributes for your variables and when you @synthesize that property to the variable you generate the getter and setter for the variable. The property name can be the same as the variable name.

Which is the default for synthesized properties?

Default Synthesis Of Properties Clang provides support for autosynthesis of declared properties. Using this feature, clang provides default synthesis of those properties not declared @dynamic and not having user provided backing getter and setter methods.

What is synthesized in Swift?

Synthesized/auto-synthesized properties in Objective C -- these are called "stored properties" in Swift. You simply declare it with var topSpeed : Double or let topSpeed : Double = 4.2 in a class declaration, exactly as you would declare a local variable in a function body.


1 Answers

There is no correct way. There is only your preferred style.

The lastest compilers do an implicit synthesise on the property declaration.

@synthesize list = _list; .

Nothing is ever written in your code. It just happens.

However that doesnt stop you doing this explicitly.

@synthesize list = somethingelse;

So when you ask for a pointer to list via the accessor (self.list) you will get a pointer to somethingelse

In most cases NSMutableArray *thing = self.list is equivalent to NSMutableArray *thing = somethingelse

And just because Apple uses a style doesn't mean that you have to do it. Each company usually has their own coding style.

The main problem with using @synthesize list; is that it poses the risk that you can write either

self.list = thing or list = thing .

The former uses the sythesised setList: accessor while the latter doesn't and put the risk of related bugs in your code , though its not as bad with ARC as you dont get leaks happening for strong properties.

What ever style you use, keep it consistent and be aware of the effects of using an ivar directly list = thing as compared to using its accessor self.list = thing

like image 110
Warren Burton Avatar answered Oct 03 '22 00:10

Warren Burton