39
Разработка приложений для iPhone и iPad занятие #3

Третье занятие курса iPhone разработки в ГУ-ВШЭ

Embed Size (px)

Citation preview

Page 1: Третье занятие курса iPhone разработки в ГУ-ВШЭ

Разработка приложений для iPhone и iPad

занятие #3

Page 2: Третье занятие курса iPhone разработки в ГУ-ВШЭ

а что было?

Page 3: Третье занятие курса iPhone разработки в ГУ-ВШЭ

• Класс объекта• NSLog()

• NSString, NSMutableString

• NSArray, NSMutableArray

• NSDictionary, NSMutableDictionary

• Свой класс

Page 4: Третье занятие курса iPhone разработки в ГУ-ВШЭ

вызов суперкласса• [super doSomething];

- (void)doSomething { // Вызов реализации у супер-класса

[super doSomething];// Теперь собственное поведение int foo = bar; // ...}

Page 5: Третье занятие курса iPhone разработки в ГУ-ВШЭ

жизненный цикл объекта

• Создание объектов• Управление памятью• Уничтожение объектов

Page 6: Третье занятие курса iPhone разработки в ГУ-ВШЭ

создание

Allocate + Initialize

Person *person; person = [[Person alloc] init];

Page 7: Третье занятие курса iPhone разработки в ГУ-ВШЭ

создание собственного init#import "Person.h"

@implementation Person

- (id)init { // сначала инициализируется супер-классif (self = [super init])

{ age = 0;name = @“Bob”; // другая инициализация...}

return self;}

@end

Page 8: Третье занятие курса iPhone разработки в ГУ-ВШЭ

множественные init

- (id)init; - (id)initWithName:(NSString *)name; - (id)initWithName:(NSString *)name age:(int)age;

Page 9: Третье занятие курса iPhone разработки в ГУ-ВШЭ

управление объектом

• Выделение памяти - alloc

• Освобождение памяти - dealloc

• dealloc никогда не вызывается самостоятельно! (почти)

Page 10: Третье занятие курса iPhone разработки в ГУ-ВШЭ

подсчет использования

• Живой пока count >0

• alloc и copy создают объект с count=1

• retain увеличивает count на 1

• release уменьшает count на 1

• когда count=0 => dealloc

Page 11: Третье занятие курса iPhone разработки в ГУ-ВШЭ

примерPerson *person = nil; person = [[Person alloc] init];

[person setName:@“John Galt”]; [person setAge:32];[person castBallot]; [person doSomethingElse];

[person release];

Page 12: Третье занятие курса iPhone разработки в ГУ-ВШЭ

«грязные делишки»

Person *person = [[Person alloc] init]; // ... [person release]; [person doSomething];

Page 13: Третье занятие курса iPhone разработки в ГУ-ВШЭ

собственный dealloc метод

#import "Person.h"

@implementation Person

- (void)dealloc { // ...

[super dealloc]; //Только здесь!} @end

Page 14: Третье занятие курса iPhone разработки в ГУ-ВШЭ

владение объектом#import <Foundation/Foundation.h>

@interface Person : NSObject {NSString *name; int age;

}

- (NSString *)name; - (void)setName:(NSString *)value;- (int)age; - (void)setAge:(int)age;- (BOOL)canLegallyVote; - (void)castBallot;@end

Page 15: Третье занятие курса iPhone разработки в ГУ-ВШЭ

владение объектом

#import "Person.h"

@implementation Person- (NSString *)name {

return name;}- (void)setName:(NSString *)newName {if (name != newName) {

[name release];name = [newName retain];

} @end

зачем проверка?

Page 16: Третье занятие курса iPhone разработки в ГУ-ВШЭ

второй вариант

#import "Person.h"

@implementation Person- (NSString *)name { return name;}- (void)setName:(NSString *)newName {if (name != newName) {[name release];name = [newName copy]; } @end

Page 17: Третье занятие курса iPhone разработки в ГУ-ВШЭ

освобождение памяти

#import "Person.h"

@implementation Person

- (void)dealloc {[name release];[super dealloc];

} @end

Page 18: Третье занятие курса iPhone разработки в ГУ-ВШЭ

autorelease

- (NSString *)fullName { NSString *result;result = [[NSString alloc] initWithFormat:@“%@ %@”, firstName, lastName];return result;}

утечка памяти!создали, но не уследили

Page 19: Третье занятие курса iPhone разработки в ГУ-ВШЭ

autorelease

- (NSString *)fullName { NSString *result;result = [[NSString alloc] initWithFormat:@“%@ %@”, firstName, lastName];

[result release];

return result;}

слишком рано!

Page 20: Третье занятие курса iPhone разработки в ГУ-ВШЭ

autorelease

- (NSString *)fullName { NSString *result;result = [[NSString alloc] initWithFormat:@“%@ %@”, firstName, lastName];

[result autorelease];

return result;}

ok!

Page 21: Третье занятие курса iPhone разработки в ГУ-ВШЭ

механизм autoreleaseAutorelease Pools (in pictures)

Launch app

Load main nib

Wait for event

Handle eventExit a

pp

App initialize

d

38Tuesday, January 12, 2010

Page 22: Третье занятие курса iPhone разработки в ГУ-ВШЭ

комильфо

• alloc, new или copy возвращают не autorelease объект

• остальные - autorelease

Page 23: Третье занятие курса iPhone разработки в ГУ-ВШЭ

нет autorelease!• когда нужно хранить объект долго• вызываем [object retain]

name = [NSMutableString string];

[name retain];

//...

[name release];

Page 24: Третье занятие курса iPhone разработки в ГУ-ВШЭ

cвойства

• Доступ к полям объекта

• Простота getter/setter

• Определение политики использования• Но! можно переопределить get и set

Page 25: Третье занятие курса iPhone разработки в ГУ-ВШЭ

декларация свойств#import <Foundation/Foundation.h>

@interface Person : NSObject {NSString *name; int age;

}

@property int age; @property (copy) NSString *name; @property (readonly) BOOL canLegallyVote;- (void)castBallot;

@end

Page 26: Третье занятие курса iPhone разработки в ГУ-ВШЭ

synthesize

@implementation Person

@synthesize age; @synthesize name;

- (BOOL)canLegallyVote { return (age > 17);

}

@end

Page 27: Третье занятие курса iPhone разработки в ГУ-ВШЭ

атрибуты свойств

• @property int age;

• @property (readonly) BOOL canLegallyVote

• @property (assign) NSString *name;

• @property (retain) NSString *name;

• @property (copy) NSString *name;

• можно самим создать get и set

Page 28: Третье занятие курса iPhone разработки в ГУ-ВШЭ

осторожно с dot

в header:@property int age;

в implementation:@implementation Person - (void)setAge:(int)newAge {

self.age = newAge; @end

Что произойдет?

Page 29: Третье занятие курса iPhone разработки в ГУ-ВШЭ

протоколы@protocol Locking- (void)lock;- (void)unlock;@end

@interface SomeClass : SomeSuperClass <Locking>//...@end

- setMyValue:(id <aProtocol>) foo;

- setMyValue:(id) foo;сравни

Page 30: Третье занятие курса iPhone разработки в ГУ-ВШЭ

основы Objective-C

done!

Page 31: Третье занятие курса iPhone разработки в ГУ-ВШЭ

домашнее задание

«Управление студентом»

Стоит 10 баллов.

Отчет.

Page 32: Третье занятие курса iPhone разработки в ГУ-ВШЭ

что дальше?

• Анатомия приложения• Основной framework

• Делегация• Свойства приложения• MVC

• Cобытия

Page 33: Третье занятие курса iPhone разработки в ГУ-ВШЭ

анатомия приложения

• Компилированный код• Nib файл ( UI элементы + связи)

• Ресурсы (изображения, звуки)

• Info.plist файл - конфигурация приложения

Page 34: Третье занятие курса iPhone разработки в ГУ-ВШЭ

UIKit Framework

• базовый framework

• стандартные элементы• запускает приложение и контролирует

lifecycle

• доступ к объекту UIApplication: [UIApplication sharedApplication];

• Управление статус-баром, иконкой приложения

Page 35: Третье занятие курса iPhone разработки в ГУ-ВШЭ

делегаты

• вместо наследования предоставляем делегат с реализованными методами

• используется в UIApplication ■ UITableView ■ UITextField

Page 36: Третье занятие курса iPhone разработки в ГУ-ВШЭ

UIApplicationDelegate

• Xcode создает самостоятельно

• участие в жизни приложения• реализует методы, которые вызывает

UIApplication

- (void)applicationDidFinishLaunching:(UIApplication *)application; - (void)applicationWillTerminate:(UIApplication *)application;- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url;- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application;

Page 37: Третье занятие курса iPhone разработки в ГУ-ВШЭ

Info.plist file

• Описание настроек приложения- Icon appearance

- Status bar style (default, black, hidden)

- Orientation

- Uses Wifi networking

- System Requirements

Page 38: Третье занятие курса iPhone разработки в ГУ-ВШЭ

посмотрим?