squeek school 2

Post on 03-Jul-2015

2.011 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

Презентация со второго занятия Squeek School

TRANSCRIPT

Разработка приложений для iOSзанятие #2

squeek school

http://school.squeek.ru

Пронин Сергей

Empatika, Software Engineer

Высшая Школа Экономики, программная инженерия

sergey.pronin@empatika.com

основы Objective-C

Objective-C

• ООП• Синтаксис• Сообщения• Управление памятью• Основные классы (NSString, NSArray,

NSDictionary)

Практика

• Класс - Stack (стэк)

• Добавить объект в стэк• init, initWithArray:

• Дать самый верхний (удаляется)• Количество элементов• Выдать объединенную строку

• Есть ли элемент или нет•

множественные 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

• retainCount

пример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 синтаксис

• object.property = 2;

• int number = object.property;

осторожно с dot

в header:@property int age;

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

self.age = newAge; @end

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

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

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

- setMyValue:(id <aProtocol>) foo;

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

основы Objective-C

done!

Основы разработки• MVC

• Views, ViewControllers

• Жизненный цикл• Xcode 4, Xcode 3 + Interface Builder

• UIKit framework

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

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

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

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

UIKit Framework

• базовый framework

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

• доступ к объекту 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

Xcode + Hello World!

Xcode

top related