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

Preview:

Citation preview

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

занятие #3

а что было?

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

• NSString, NSMutableString

• NSArray, NSMutableArray

• NSDictionary, NSMutableDictionary

• Свой класс

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

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

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

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

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

создание

Allocate + Initialize

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

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

@implementation Person

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

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

return self;}

@end

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[person release];

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

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

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

#import "Person.h"

@implementation Person

- (void)dealloc { // ...

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

владение объектом#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

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

#import "Person.h"

@implementation Person- (NSString *)name {

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

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

} @end

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

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

#import "Person.h"

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

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

#import "Person.h"

@implementation Person

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

} @end

autorelease

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

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

autorelease

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

[result release];

return result;}

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

autorelease

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

[result autorelease];

return result;}

ok!

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

Launch app

Load main nib

Wait for event

Handle eventExit a

pp

App initialize

d

38Tuesday, January 12, 2010

комильфо

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

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

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

name = [NSMutableString string];

[name retain];

//...

[name release];

cвойства

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

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

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

декларация свойств#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

synthesize

@implementation Person

@synthesize age; @synthesize name;

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

}

@end

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

• @property int age;

• @property (readonly) BOOL canLegallyVote

• @property (assign) NSString *name;

• @property (retain) NSString *name;

• @property (copy) NSString *name;

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

осторожно с dot

в header:@property int age;

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

self.age = newAge; @end

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

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

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

- setMyValue:(id <aProtocol>) foo;

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

основы Objective-C

done!

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

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

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

Отчет.

что дальше?

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

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

• Cобытия

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

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

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

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

UIKit Framework

• базовый framework

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

lifecycle

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

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

делегаты

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

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

UIApplicationDelegate

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

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

UIApplication

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

Info.plist file

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

- Status bar style (default, black, hidden)

- Orientation

- Uses Wifi networking

- System Requirements

посмотрим?

http://empatika.comoleg.parinov@empatika.com

Recommended