I would like to show and discuss some examples on how to add and manipulate properties in Objective-C class. : A classic example, precisely, is the following, in the definition of our interface class defines two properties nome and cognome :
1 2 3 4 5 6 7 8 9 10 11 |
e setter usati rispettivamente per leggere ed impostare le nostre due proprietà: In the implementation file the statement insert @synthesize so that Xcode will produce for us the methods getter and setter , respectively, used to read and set our two properties:
1 2 3 4 5 6 7 8 | / / MyClass.m # Import "MyClass.h" @ Implementation MyClass @ Synthesize name, surname; @ End |
, possiamo scrive: When you're going to use our class MyClass , that is when istanziaremo an object of type MyClass , we can write:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | / / Any other class, as AppDelegate / / In the file. H # Import <UIKit/UIKit.h> # Import "MyClass.h" @ Class TestViewController; NSObject <UIApplicationDelegate> { @ Interface TesAppDelegate: NSObject {<UIApplicationDelegate> UIWindow * window; * TestViewController viewController; MyClass * myClass; } / / In the file. M MyClass alloc ] ; myClass = [MyClass alloc]; "Giovambattista" ; miaClasse.nome @ = "Giovambattista"; "miaClasse.nome = %@" , miaClasse.nome ) ; NSLog (@ "miaClasse.nome =% @", miaClasse.nome); |
Or, which is equivalent to:
1 2 3 | / / Always in the file. M @ "Undolog" ] ; [SetNome myClass: @ "Undolog"]; "miaClasse.nome = %@" , [ miaClasse nome ] ) ; NSLog (@ "miaClasse.nome =% @", [myClass name]); |
So far so good. However, it could mislead the equivalence of the "variable" internal (ivar) with the name of the property itself. To understand the difference, propose again the same as doing without, this time, the @synthesize . . Now, therefore, we should take care to write the methods getter and setter . To further emphasize the differences, will rename the internal variables by inserting an underscore before the name. But we see the code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # Import <Foundation/Foundation.h> NSObject { @ Interface MyClass: NSObject { _nome; NSString * _Name; _cognome; NSString * _cognome; } NSString * ) nome; // get - ( NSString *) name; / / get NSString * ) cognome; // get - ( NSString *) name; / / get void ) setNome : ( NSString * ) stringaIngresso; // set - (Void) setNome: ( NSString *) stringaIngresso; / / set void ) setCognome : ( NSString * ) stringaIngresso; // set - (Void) setCognome: ( NSString *) stringaIngresso; / / set @ End |
. Unlike the previous pointers to internal variables (incapsultate) have become _nome and _cognome . . @property è scomparso, in quanto non serve più. In addition there are four definitions of methods that represent our get and set . @property has disappeared, as no longer needed.
We see the implementation file MyClass.m :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | # Import "MyClass.h" @ Implementation MyClass / / Get a "name" NSString * ) nome { - ( NSString *) name { _Name return; } / / Set to "name" void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso _Name = stringaIngresso; } / / Get for "surname" NSString * ) cognome { - ( NSString *) name { _cognome return; } / / Set for "surname" void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso _cognome = stringaIngresso; } @ End |
Written as a class can be used exactly like the previous one, namely:
1 2 3 4 5 6 7 8 | MyClass alloc ] ; myClass = [MyClass alloc]; "Giovambattista" ; miaClasse.nome @ = "Giovambattista"; "miaClasse.nome = %@" , miaClasse.nome ) ; NSLog (@ "miaClasse.nome =% @", miaClasse.nome); / / Or, which is equivalent to: @ "Undolog" ] ; [SetNome myClass: @ "Undolog"]; "miaClasse.nome = %@" , [ miaClasse nome ] ) ; NSLog (@ "miaClasse.nome =% @", [myClass name]); |
e set , evidenziando – anche con l'aggiunta dell'underscore – le differenze tra il nome della proprietà e la sua ivar interna _nome . At the level of educational neglect @synthesize forced us to write "their own" methods get and set , highlighting - even with the addition dell'underscore - the differences between the property name and its internal ivar _nome .
permette un reale controllo del dato prima della sua impostazione (o prima della sua lettura) e quindi un reale incapsulamento per proteggere la variabile interna. At the functional level the personal use of the methods get and set allows real control of the data before its setting (or prior to its reading) and then a real encapsulation to protect the internal variable.
For example it would be possible to prevent the passage of empty strings to the property nome :
1 2 3 4 |
Further variation
If you want to use the internal variables with the underscore in front (who rpoviene Adobe Actionscript could be used as well) is not necessary to abandon the use of the directive @synthesize . Xcode makes it possible to "merge" the methods mentioned above:
1 2 | _nome; @ Synthesize name = _Name; _cognome; @ Synthesize name = _cognome; |
. In doing so we could use the pointer to the internally _nome , "summed up" - to the outside - as a property nome . e setter , è vero anche che lo fa solo se non li trova, quindi se desiderate “implementare” un vostro metodo di getter e/o setter potete farlo anche se avete usato la direttiva @synthesize . Moreover, it is true that the use of @synthesize produces automatic generation methods (messages) of getter and setter , it is also true that if he does not find them, so if you want to "implement" a method for your getter and / or setter you can do this even if you used the directive @synthesize .
Memory allocations
In the examples above I have omitted some important details for a real implementation. First of all, I have not shown any method init() , useful for object initialization and default values. Moreover, there is the addition of a method dealloc() :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | / / File MyClass.m # Import "MyClass.h" @ Implementation MyClass id ) init { - (Id) init { self = [ super init ] ) { if (self = [super init]) { "Nome preimpostato" ; _Name @ = "Preset Name"; "Cognome preimpostato" ; _cognome @ = "Preset Name"; } return self; } void ) dealloc { - (Void) dealloc { ; [_Name Release]; ; [_cognome Release]; ; [Super dealloc]; } NSString * ) nome { - ( NSString *) name { _Name return; } void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso stringaIngresso == @ "" ) stringaIngresso = @ "senza nome" ; if (@ stringaIngresso == "") @ stringaIngresso = "no name"; _Name = stringaIngresso; } NSString * ) cognome { - ( NSString *) name { _cognome return; } void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso _cognome = stringaIngresso; } @ End |
, etc… In the future we will then see the details on the properties readonly , retain , etc ... ![]()






Latest Comments
Giovambattista Fazioli : @ paso: absolutely. Simply identifying the field [cci] input [/ cci] you want to ...
paso : Hello I would like to request a service, you can use the datepicker with cform7 I spiegp best I can implement ...
Simon : It annoys disturbed again and use that space for these things ... however it does not work ...
Giovambattista Fazioli : @ Barbara: If you mean the bottom to start writing down what it depends on where ...
Barbara : Hello, is very interesting but how do you write at the bottom instead of the above? Thanks