Upload
oleg-parinov
View
1.640
Download
4
Embed Size (px)
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
посмотрим?