Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
-
Upload
alberto-pasca -
Category
Technology
-
view
341 -
download
0
description
Transcript of Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
contents | day 01 origini Xcode, Interface Builder, Instruments framework base sintassi gestione memoria esempi pratici
Mobile Apps con Objective-c | alberto pasca
slide 1/2810
origini
Mobile Apps con Objective-c | alberto pasca
originiMobile Apps con Objective-c |
alberto pasca
SmallTalk + C = OOPC + frameworks = Objective-C
?GCC
ObjC
OOPC
origini - devicesMobile Apps con Objective-c |
alberto pasca
Display: 320x480
AccelerometroProssimitàGps / WifiBluetooth
Ram 128Mb -> 512MbCPU 412Mhz -> 2x800Mhz
Retina display 640x960
Display: 768x1024
AccelerometroProssimitàGps / WifiBluetooth
Ram 256Mb -> 512MbCPU 1Ghz -> 2x880Mhz
iPod - iPhone 3G / 3GS / 4 / 4S - iPad / iPad2
xcode
Mobile Apps con Objective-c | alberto pasca
Cosa vedremo…
• xcode• configurazione• target• file.plist• alberatura progetto• interface builder• la window• le view• i componenti• IBAction• IBOutlet• frameworksLezione_00_Xcode
xcode – codeMobile Apps con Objective-c |
alberto pasca
frameworks
Mobile Apps con Objective-c | alberto pasca
Principali:prefix
Foundation (NS) UIKit (UI) QuartzCore (CA) CoreGraphics (CG) CoreLocation (CL)
frameworks – introMobile Apps con Objective-c |
alberto pasca
Librerie software che aumentano le funzionalità di una classe
http://tinyurl.com/objc-prefix
Foundation
NSObjectNSStringNSNumberNSArrayNSDictionaryNSUrlNSTimer
NSNotificationNSException[…]
frameworksMobile Apps con Objective-c |
alberto pasca
UIKit
UIViewUIWindowUIButtonUILabel
UITableView
UITextFieldUISlider
UIWebViewUIDeviceUIEvent[…]
CoreGraphics
CGColor
CGContext
CGFont
CGGradient
CGImage
CGLayer
CGPDFPage
[…]
frameworksMobile Apps con Objective-c |
alberto pasca
CoreLocation
CLGeocoderCLHeadingCLLocation
CLLocationManager
CLPlacemarkCLRegion[…]
QuartzCore
CAAnimation
CABasicAnimationCALayer
CAScrollLayer
CATiledLayerCATransition[…]
sintassi
Mobile Apps con Objective-c | alberto pasca
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!
sintassi – operatoriMobile 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”;
sintassi – loggingMobile Apps con Objective-c |
alberto pasca
NSLog(@”Log string!”);
Formati: %@ -> descrizione oggetto %d - %u -> int / uint %f - %e -> float / exp %c - %C -> char 8b / char 16b %s - %S -> null-terminated char 8/16 %p -> pointer 0x %x - %X -> hex lowercase/uppercase
NSLog(@”tricks: %s - %d - %s",
__FUNCTION__, __LINE__, __FILE__);
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
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
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;
sintassi – classi (gerarchia)
NSObject
NSArray NSString UIResponder
UIView
UIControl
UITextField UISlider
UILabel
CLASSEDescrizione 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
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
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
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)
mu
tually
exclu
siv
e
sintassi – proprietàMobile Apps con Objective-c |
alberto pasca
oggetto0x01retain
assign
oggetto0x02copy
0x01
+1
+0
+1
@property (nonatomic, assign) int CurrentGameLevel;
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
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!
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
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
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!
sintassi – codeMobile 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
gestione della memoria
Mobile Apps con Objective-c | alberto pasca
memoria – alloc / releaseMobile 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)
memoria – oggetti in autorelease
Mobile Apps con Objective-c | alberto pasca
NSMutableArray *arr1 = [[NSMutableArray alloc] init];
// do somethings
[arr1 release];
NSMutableArray *arr2 = [[[NSMutableArray alloc] init] autorelease];
NSMutableArray *arr3 = [NSMutableArray array];
NSMutableArray *arr4 =
[NSMutableArray arrayWithObjects:@"a", @"b", nil];
NSMutableArray *arr5 =
[NSMutableArray alloc] initWithObjects:@"a", @"b", nil];
1
2
3
4
5
memoria - leaksMobile Apps con Objective-c |
alberto pasca
- (void) leakyMethod { // This is a leak NSArray *array = [[NSArray alloc] init]; }
• MEMORY LEAK
• CLANG_STATIC_ANALYZER
• INSTRUMENTS
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
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
Cosa vedremo…
• alloc + init• release• retain count• memory leak• autorelease• autorelease pool• runtime error• EXC_BAD_ACCESS• NSZombie• Instruments• debug
Lezione_02_Memoria
memoria – codeMobile Apps con Objective-c |
alberto pasca
# EOF - day 01Coming next:
• Interfacce grafiche• Eventi• Foundation.framework• Persistenza dati• Librerie di sistema• Librerie esterne
tks
Mobile Apps con Objective-c | alberto pasca