9. Principali:
prefix
Foundation (NS)
UIKit (UI)
QuartzCore (CA)
CoreGraphics (CG)
CoreLocation (CL)
frameworks – intro
Mobile Apps con Objective-c | alberto pasca
Librerie software che aumentano le funzionalità di una classe
http://tinyurl.com/objc-prefix
13. sintassi – variabili
#define Moltiplica(x,y) (x*y)
const int valore = 28;
int val = 0;
double val = .5;
float val = 10.;
char val = 'a';
BOOL val = YES | NO;
NSString *val = @"stringa";
id val = MyClass | MyObject;
SEL selector = @selector(MyMethod);
Mobile Apps con Objective-c | alberto pasca
Dynamic Typing
Tipi base
> ereditati dal C
Tipi speciali
> ereditati da SmallTalk
ed aggiunti in ObjC
Ogni oggetto va dicharato
come un puntatore!
14. sintassi – operatori
Mobile Apps con Objective-c | alberto pasca
Aritmetici
+ - * / %
Assegnamento
+= -= *= /= %=
++ --
Comparazione
== != > < >= <=
Bit
<<= >>= &= |= ^=
Ternari
[condition] ? [true] : [false]
myvar =
x == y ? y <= z ?
y : x != j ? k
>= j ? k : j : x :
"omg_i_did_again”;
16. sintassi – cicli e condizioni
for ( int i=0; i<28; i++ ) {
NSLog(@"I: %d", i);
}
int i=28;
while ( i != 0 ) {
NSLog(@"I: %d", --i);
}
int i=28;
do {
NSLog(@"I: %d", i--);
} while ( i!=0 );
Mobile Apps con Objective-c | alberto pasca
if ( i==28 ){
NSLog(@"28!!!");
} else {
NSLog(@"I: %d", i);
}
switch ( i ) {
case 1:
NSLog(@"UNO");
break;
case 2:
NSLog(@"DUE");
break;
default: break;
}
FOR
WHILE
DO-WHILE
IF - ELSE
SWITCH
17. sintassi – enumerazioni
aClass *class = [[aClass alloc] init];
NSArray *arr = [NSArray arrayWithObjects:class, class, class, nil];
int tot = [arr count];
for ( int i=0; i<=tot; i++ )
NSLog(@"STR: %@", [arr objectAtIndex:i]);
for (aClass *c in arr)
NSLog(@"STR: %@", [c description]);
NSEnumerator *en = [arr objectEnumerator];
while (class == [en nextObject] )
[class doWork];
Mobile Apps con Objective-c | alberto pasca
CLASSICO
FOREACH
ENUM
18. sintassi - metodi
Senza parametri:
C -> oggetto.Metodo();
OBJC -> [oggetto Metodo];
Con parametri:
C -> oggetto.Metodo(5, "pippo");
OBJC -> [oggetto MetodoConNumero:5 andStringa:@"pippo"];
Non si chiama un metodo ma si invia un messaggio!
Mobile Apps con Objective-c | alberto pasca
- (void) Metodo;
- (void) MetodoConNumero:(int)num andStringa:(NSString*)str;
19. sintassi – classi (gerarchia)
NSObject
NSArray NSString UIResponder
UIView
UIControl
UITextField UISlider
UILabel
CLASSE
Descrizione astratta che
definisce il comportamento di un
oggetto.
OGGETTO
È un entità appartenente alla
classe, con un proprio stato e
comportamento.
Mobile Apps con Objective-c | alberto pasca
20. sintassi – classi (interface)
#import "aSuperClass.h”
#import <aSuperClass.h>
#include "aSuperClass.h”
#include <aSuperClass.h>
@class aSuperClass;
@interface MyClass: aSuperClass {
int pippo;
}
-/+ (void) mioMetodo;
@end
.H Dichiarazione di variabili e prototipi dei metodi
Mobile Apps con Objective-c | alberto pasca
inclusione lib/classi
Variabili
Metodi
21. sintassi – classi (implementation)
#import "MyClass.h"
@implementation MyClass
- (void) mioMetodoIstanza {
// implementazione
}
+ (void) mioMetodoDiClasse {
// implementazione
}
@end
Mobile Apps con Objective-c | alberto pasca
.M Implementazione metodi
Fine implementazione
Inizio implementazione
Implementazione metodi
22. sintassi – proprietà
nonatomic
+
readonly vs readwrite
+
retain vs assign vs copy
Mobile Apps con Objective-c | alberto pasca
Creano i Getters / Setters per una variabile
tramite le keywords @property (file .H) e @syntetize/@dynamic (file .M)
mutually
exclusive
23. sintassi – proprietà
Mobile Apps con Objective-c | alberto pasca
oggetto0x01retain
assign
oggetto0x02copy
0x01
+1
+0
+1
@property (nonatomic, assign) int CurrentGameLevel;
24. sintassi – proprietà
Mobile Apps con Objective-c | alberto pasca
- (void) setVal:(NSString*)v { variabile = v; }
- (void) setVal:(NSString*)v {
if ( v != variabile ) {
[variabile release];
variabile = [v copy];
}
}
- (void) setVal:(NSString*)v {
if ( v != variabile ) {
[variabile release];
variabile = [v retain];
}
}
assign
copy
retain
25. sintassi – oggetti
Creazione oggetti:
Auto car = new Auto();
Auto *car = [[Auto alloc] init];
Rilascio oggetti:
if (car != nil) [car release];
Mobile Apps con Objective-c | alberto pasca
Invece di invocare dei metodi, si chiede all’oggetto in questione di fare qualcosa..
alloc + init è il pattern di
defaul per creare un oggetto!
26. sintassi – forwarding
Invio di messaggi ad oggetti non specificati
nell’interfaccia o addirittura non esistenti !
id delegate;
isKindOfClass - respondsToSelector
- (void) sendMessage {
if ([delegate isKindOfClass:[MyClass class]])
if ([delegate respondsToSelector:@selector(method)])
[delegate method];
- }
Mobile Apps con Objective-c | alberto pasca
27. sintassi – protocolli
Callback
Ereditarietà multipla
Il metodo chiamato potrebbe non esistere!
Protocolli formali / informali, o meglio…
@required e @optional
@protocol ClassDelegate
- (void) HoFinitoFaiQualcosa;
@end
Mobile Apps con Objective-c | alberto pasca
Scambiano messaggi tra le classi o le interfaccie stesse
28. sintassi – categorie
#import <Foundation/Foundation.h>
@interface NSString (HtmlStrings)
- (BOOL) isUrl;
@end
#import "NSString+Html.h"
@implementation NSString (HtmlStrings)
- (BOOL) isUrl {
if ( [self hasPrefix:@"http://"] )
return YES;
return NO;
}
@end
Mobile Apps con Objective-c | alberto pasca
Permettono di aggiungere funzionalità ad oggetti esistenti e compilati
Utilizzo:
#import “NSString+Html.h”
NSString *Str =
@"http://www.cutaway.it";
if ( [Str isUrl] ) return YES;
La classe NSString ha un
nuovo metodo!
29. sintassi – code
Mobile Apps con Objective-c | alberto pasca
Cosa vedremo…
• main
• application delegate
• view controller
• variabili
• cicli
• enumerazioni
• classi
• metodi (pubblici / privati)
• protocolli
• categorie
• properties
• debug
• log informations
Lezione_01_Sintassi
31. memoria – alloc / release
Mobile Apps con Objective-c | alberto pasca
Basata sui REFERENCE COUNT
Oggetti creati con pattern ALLOC INIT hanno RETAIN COUNT +1
Ogni oggetto rilasciato con RELEASE ha un RC di -1
Quando RC è 0 viene chiamato il distruttore (dealloc)
33. memoria - leaks
Mobile Apps con Objective-c | alberto pasca
- (void) leakyMethod {
// This is a leak
NSArray *array = [[NSArray alloc] init];
}
• MEMORY LEAK
• CLANG_STATIC_ANALYZER
• INSTRUMENTS
34. memoria - autorelease
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[...]
[pool drain];
[pool release]; // ci pensa il drain a fare il release in ambienti RC!
Il pool invia automaticamente un RELEASE a tutti gli oggetti del
pool, pertanto la responsabilità di release passa al POOL.
Command-Line App
Cicli con molti oggetti temporanei
Thread
Mobile Apps con Objective-c | alberto pasca
AUTORELEASE POOL
35. memoria – zombie
NSZombieEnabled = YES;
Mobile Apps con Objective-c | alberto pasca
1 - EXC_BAD_ACCESS
NSString *myString;
- (void)viewDidLoad {
myString = [NSString stringWithFormat:@”asd"];
NSLog(@"%@", myString); // OK
}
- (void) aMethod {
NSLog(@"%@", myString); // EXC_BAD_ACCESS
}
2 – [myString] message sent to deallocated instance 0x5633b0
36. Cosa vedremo…
• alloc + init
• release
• retain count
• memory leak
• autorelease
• autorelease pool
• runtime error
• EXC_BAD_ACCESS
• NSZombie
• Instruments
• debug
Lezione_02_Memoria
memoria – code
Mobile Apps con Objective-c | alberto pasca
37. # EOF - day 01
Coming next:
• Interfacce grafiche
• Eventi
• Foundation.framework
• Persistenza dati
• Librerie di sistema
• Librerie esterne
tks
Mobile Apps con Objective-c | alberto pasca