Archive December, 2009

Objective-C: expose properties in a class

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
/ / MyClass.h
# Import <Foundation/Foundation.h>

NSObject { @ Interface MyClass: NSObject {
nome; NSString * name;
cognome; NSString * name;
}

retain ) NSString * nome; @ Property (retain) NSString * name;
retain ) NSString * cognome; @ Property (retain) NSString * name;
@ End

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
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
stringaIngresso == @ "" ) stringaIngresso = @ "senza nome" ; if (@ stringaIngresso == "") stringaIngresso @ = "no name";
_Name = stringaIngresso;
}

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 ... :)

More ...

Browser or mobile browser?

Our Web site is no longer viewed only from computer terminals. With the spread of mobile, thanks to Apple iPhone, access to the site or blog is increasingly being performed by a variety of mobile devices. Become a Web Developer so many need to be able to intercept and identify the different "agents", ie the means by which a user is viewing (browsing) our pages.

More ...

Customizing a Form graphically

I was asked how to customize a graphical form, including a search box like the one on this blog. The technique used, or rather that I use, it is obviously valid for any type of module form. What changes is only the complexity of the work to be done depending on the complexity of the form itself.

More ...

WordPress: view the latest topics in bbPress

We have seen how the integrated kernel WordPress bbPress , for example, to use some function or share your WordPress theme. Now we will see the contraio, namely how to display the information in the bbPress forum home page of WordPress. To do this there are some plugins (some working and others not). Here we shall see how we write a - really - simple function that, in case, can be improved and perfected in all cases.

More ...

Apple iPhone: Create a custom toggle button

non funzionano quando un UIButton è impostato in modalità UIButtonTypeCustom ! The states UIControlStateSelected or UIControlStateHighlighted do not work when a UIButton mode is set UIButtonTypeCustom ! Or rather, do not work (because reserved for other types of button), for example to create a button with two states: toggle note. If we have created two images (stato1.png and stato2.png) for our button, we can proceed as follows:

1
2
3
/ / The header file that we create a global variable for usaremo
/ / Toggle the check was
BOOL toggleFlag;

Now we create our button:

1
2
3
4
5
6
7
8
9
/ / We create a button and we place it initially in the state "stato1.png"
/ / Edit initWithFrame: (CGRect)} {100,100,50,50 with the position and
/ / Size of your image has
; toggleFlag = YES;
[ [ UIButton buttonWithType : UIButtonTypeCustom ] initWithFrame : ( CGRect ) { 100 , 100 , 50 , 50 } ] ; UIButton ToggleButton * = [[UIButton buttonWithType: UIButtonTypeCustom] initWithFrame: (CGRect) {100, 100, 50, 50}];
@ "" forState : UIControlStateNormal ] ; [ToggleButton setTitle: @ "" forState: UIControlStateNormal];
[ UIImage imageNamed : @ "stato1.png" ] forState : UIControlStateNormal ] ; [ToggleButton setBackgroundImage: [UIImage imageNamed: @ "stato1.png"] forState: UIControlStateNormal];
self action : @selector ( onToggle : ) forControlEvents : UIControlEventTouchUpInside ] ; [ToggleButton AddTarget: self action: @ selector (onToggle:) forControlEvents: UIControlEventTouchUpInside];
toggleButton ] ; [Self.view addSubview: ToggleButton];

When you click on the button will send a message to be managed onToggle :

1
2
3
4
5
6
7
void ) onToggle : ( id ) sender { - (Void) onToggle: (id) sender {
/ / Retrieve pointer to UIButton
( UIButton * ) sender; UIButton ButtonClicked * = (UIButton *) sender;
/ / Executing the Toogle
toggleFlag =! toggleFlag;
[ UIImage imageNamed : ( toggleFlag ) ? @ "stato1.png" : @ "stato2.png" ] forState : UIControlStateNormal ] ; [ButtonClicked setBackgroundImage: [UIImage imageNamed: (toggleFlag)? @ "Stato1.png" @ "stato2.png"] forState: UIControlStateNormal];
}

More ...

Very short snippet: streaming mp3 files to Apple iPhone

An alternative really easy to run a stream a mp3 file on the Apple iPhone could be:

More ...


Stop SOPA