Upload
oleg-parinov
View
2.010
Download
2
Embed Size (px)
DESCRIPTION
Презентация со второго занятия Squeek School
Citation preview
Разработка приложений для iOSзанятие #2
squeek school
Пронин Сергей
Empatika, Software Engineer
Высшая Школа Экономики, программная инженерия
основы 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