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 as follows: in the definition of our class interface we define 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 we insert the statement @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, last name; @ 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 "variabli" internal (ivar) as real property. To understand the difference, propose again the same as doing without, this time, the @synthesize . . Now, therefore, we should deal with us to write the methods getter and setter . To further emphasize the differences, the internal variables rinominerò 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 example the pointers to the internal variables (incapsultate) have become _nome and _cognome . . @property è scomparso, in quanto non serve più. In addition there are four method definitions 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 to "Last Name" void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso _cognome = stringaIngresso; } @ End |
A class so written can be used exactly as 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 a 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 variant
If you wish 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 above methods:
1 2 | _nome; @ Synthesize name = _Name; _cognome; @ Synthesize name = _cognome; |
. In doing so we could use internally pointer _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 . Furthermore, although the use of @synthesize produces automatic generation methods (messages) of getter and setter , is also true that it does so only if it finds them, so if you want to "implement" a method for your getter and / or setter 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. Furthermore, it lacks 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
kOoLiNuS : @ Giovambattista Fazioli: thank you! more than willing!
Giovambattista Fazioli : @ kOoLiNuS: Quiet, you can probably anticipate that WPX Cleanfix will be free, and ...
kOoLiNuS : @ kOoLiNuS: a missing
and a 
kOoLiNuS : @ Giovambattista Fazioli: I subscribed to, but when I was my amateur use of the platform ...
Giovambattista Fazioli : @ kOoLiNuS: Yes, this is a known issue. Occurs when the tables in question are ...