Execute a method after n seconds
The whole family performSelector is really interesting and can be useful in a multitude of cases. Its application simplest and most common is the following:
1 2 3 4 5
| @selector ( myMethod ) withObject : nil afterDelay : 3 ] ; [Self performSelector: @ selector (myMethod) withObject: nil afterDelay: 3]; / / void ) myMethod { - (Void) {myMethod "Hello World!" ) ; NSLog (@ "Hello World!"); } |
However, consider that the "timer" is not accurate. This procedure, therefore, should be used when not required "considerable" time precision.
Retrieve the version of the
1 2
| version = [ [ [ NSBundle mainBundle ] infoDictionary ] objectForKey : @ "CFBundleVersion" ] ; NSString * version = [[[ NSBundle mainBundle] infoDictionary] objectForKey: @ "CFBundleVersion"]; "versione = %@" , version ) ; NSLog (@ "Version =% @", version); |
YES, true or TRUE?
e TRUE sono in pratica la stessa edentica cosa: Going to comb through the Kernel Apple iPhone you can realize that YES , true and TRUE are virtually the same thing edentica:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| / / Definition of YES # Define YES (BOOL) 1 # Define NO (BOOL) 0
/ / Definition of true # Define true 1 # Define false 0
/ / Definition of TRUE # If! Defined (TRUE) # Define TRUE 1 # Endif
# If! Defined (FALSE) # Define FALSE 0 # Endif |
At least for now ...
Vibration
1 2 3
| # Import <AudioToolbox/AudioToolbox.h> / / ; AudioServicesPlaySystemSound (kSystemSoundID_Vibrate); |
Pointer CGImageRef starting from a UIImage
1 2 3 4
| [ UIImage imageNamed : @ "LittleHeart.png" ] ; UIImage * heart = [UIImage imageNamed: @ "LittleHeart.png"]; heart CGImage ] ; CGImageRef image = [heart CGImage]; / / The image can now be "rasterized" on a CGContextRef CGRect ) { 0 , 0 , 100 , 100 } , image ) ; CGContextDrawImage (c, (CGRect) {0, 0, 100, 100}, image); |
Animations
1 2 3 4 5
| nil context : NULL ] ; [UIView beginAnimations: nil context: NULL]; 1.5 ] ; [UIView setAnimationDuration: 1.5]; UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut]; / / ... ; [UIView commitAnimations]; |
NSLog
1 2 3
| "NSString object %@ " , myString ) ; NSLog (@ "NSString object% @", myString); "Float: %f " , myFloat ) ; NSLog (@ "float:% f", myFloat); "Integer: %i " , myInt ) ; NSLog (@ "Integer:% s", myInt); |
Converter from RGB to UIColor
1
| # Define RGBA (r, g, b, a) [UIColor colorWithRed: r/255.0 green: blue g/255.0: b/255.0 alpha: a] |
Passing parameters to an NSTimer
Exploiting the parameter userInfo you can send a pointer to our object to the method invoked by timer.
1 2 3 4 5 6 7 8 9 10 11 12 13
| scheduledTimerWithTimeInterval : 1 target : self selector : @selector ( timerMethod ) userInfo : objectPointer repeats : YES ] ; [ NSTimer scheduledTimerWithTimeInterval: 1 target: self selector: @ selector (timerMethod) userInfo: objectPointer repeats: YES]; / / ... void ) timerMethod : ( NSTimer * ) timer { - (Void) timerMethod: ( NSTimer *) timer { / / Retrieve the pointer to my object timer userInfo ] ; objectPointer = [timer userInfo]; / / Or myMethod ] ; [[Timer userInfo] myMethod]; [ [ timer userInfo ] myProperty ] ; int a = [[timer userInfo] myProperty]; / / Which is the same [ objectPointer myProperty ] ; int a = [objectPointer myProperty]; } |
Running time
Here is a simple way to calculate short time needed to check the speed of code execution:
1 2 3 4
| ; CFAbsoluteTime initialTime = CFAbsoluteTimeGetCurrent (); / / ... code ; CFAbsoluteTime finalTime = CFAbsoluteTimeGetCurrent (); "Tempo trascorso %f" , finalTime - initialTime ) ; NSLog (@ "elapsed time% f", finalTime - initialTime); |
More ...
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 :
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:
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 may be used exactly as the previous, ie:
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:
@ "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 ...
non funzionano quando un UIButton è impostato in modalità UIButtonTypeCustom ! The states UIControlStateSelected or UIControlStateHighlighted do not work when a UIButton is set in mode 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 ...
An alternative really easy to run a stream a mp3 file on the Apple iPhone could be:
More ...
1. Strings on multiple lines
In Xcode, you can "break" a string across multiple lines by inserting at the end with a backslash "\". This feature can be very useful when, for example, we want to insert the HTML text in a control UIWebView :
More ...
The control UIDatePicker is perhaps the most beautiful graphics controller present on the Apple iPhone. Besides the beauty is also simple to use, extremely versatile and used in many situations.
More ...
o CGPoint , ad esempio. The syntax NSLog(@"%@", ... ); works and is used to obtain information about objects, but does not work on C data types such as struct CGRect or CGPoint , for example. o NSStringFromCGPoint : To take advantage of NSLog(@"%@", ... ); also C-style structs we can lean on conversion functions like NSStringFromCGRect() or NSStringFromCGPoint :
1 2 3 4 5
| CGRect ) { 10 , 20 , 30 , 40 } ; CGRect mioRect = (CGRect) {10, 20, 30, 40}; CGPoint ) { 32 , 64 } ; CGPoint mioPoint = (CGPoint) {32, 64}; / / "Info rettangolo: %@" , NSStringFromCGRect ( mioRect ) ) ; NSLog (@ "Info rectangle:% @", NSStringFromCGRect (mioRect)); "Info point: %@" , NSStringFromCGPoint ( mioPoint ) ) ; NSLog (@ "Info point:% @", NSStringFromCGPoint (mioPoint)); |
Specifically, it is possible to refine the procedures Corresponding small useful macros like:
1
| # Define NSLogRect (rect) NSLog (@ "% s (% 0.0f,% 0.0f)% 0.0fx% 0.0f", # rect, rect.origin.x, rect.origin.y, rect.size.width , rect.size.height) |
Or:
1 2 3 4
| # Define NSLogCGPoint (point) NSLog (@ "% s (% 0.0f,% 0.0f)", # point.x point, Point.y)
CGPoint ) { 32 , 64 } ; CGPoint mioPoint = (CGPoint) {32, 64}; ; NSLogCGPoint (mioPoint); |
That will give as output:
1
| 32 , 64 ) mioPoint: (32, 64) |
More ...
Application Icon
The 57 × 57 pixel icon that will represent our application is "impaired" automatically by Apple iPhone: adds a rounded edge, a brightened and 3D. This setting can be changed by selecting the file [nome applicazione]-Info.plist and adding the property "Icon Already includes gloss and bevel effects":
More ...
XCode is a very powerful development environment and reserves some surprises. It allows a function similar to the "snippet" of the famous editor TextMate . In practice it is possible to insert blocks of code using the sequence ESC + a combination of one or more sequences of characters. e otterrete: For example, if you want to insert a block if try pressing ESC+if and you'll get:

. As shown in the figure, a menu appears (the same auto-completion) where you can choose between a simple block if or if/else . Clicking "send" you get:

Here are two links for the complete list of keyboard shortcuts:
More ...
If you need to generate random numbers in an application must set aside Apple iPhone Objective-C, because it does not propose any class order. The solution is proposed that the C: rand(), srand(), random(), srandom() e arc4random() .
More ...
Latest Comments
Mark : Thank you very much, I've lit
I solved it by setting [cc_objc] / / OptionViewController.m - ...
Giovambattista Fazioli : @ Mark: I suggest you think a more correct approach. If you run the subclass of the tab ...
Mark : Excuse the spam .. I noticed that there is an error .. here is the correction [cc_objc] / PrimaClasse.h ** ** / # import ...
Marco : forgotten .. in [cci] OptionViewController [/ cci] for [cci] @ syntetize [/ cci] I put the delegate
louis : very clear and simple I have to admit that writing a pa hardly use delegates created by ...