SlideShare una empresa de Scribd logo
1 de 39
Descargar para leer sin conexión
Разработка приложений
   для 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!
Autorelease Pools (in pictures)

                 механизм autorelease




                 pp                   zed                                   nt               t
          ch
               a
                                  ali                   nib               e                en          pp
        n                      iti                ain                   ev               ev        it a
      au                    in                                       or
                                                                                     dle         Ex
     L
                       pp                      adm               it f              n
                      A                     Lo                Wa                 Ha

Tuesday, 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) foo;
      сравни
               - setMyValue:(id <aProtocol>) 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.com
oleg.parinov@empatika.com

Más contenido relacionado

Más de Oleg Parinov

Технопарк - Управление продуктом - Лекция №2
Технопарк - Управление продуктом - Лекция №2Технопарк - Управление продуктом - Лекция №2
Технопарк - Управление продуктом - Лекция №2Oleg Parinov
 
Лекция №2 Курса Product Management в НИУ-ВШЭ
Лекция №2 Курса Product Management в НИУ-ВШЭЛекция №2 Курса Product Management в НИУ-ВШЭ
Лекция №2 Курса Product Management в НИУ-ВШЭOleg Parinov
 
Product management - лекция №1
Product management - лекция №1Product management - лекция №1
Product management - лекция №1Oleg Parinov
 
Pivot + Lean Startup #poSEEDelki Harvest
Pivot + Lean Startup #poSEEDelki HarvestPivot + Lean Startup #poSEEDelki Harvest
Pivot + Lean Startup #poSEEDelki HarvestOleg Parinov
 
Start-up Reality Check - Empatika в ВШЭ
Start-up Reality Check - Empatika в ВШЭStart-up Reality Check - Empatika в ВШЭ
Start-up Reality Check - Empatika в ВШЭOleg Parinov
 
Генетические алгоритмы
Генетические алгоритмыГенетические алгоритмы
Генетические алгоритмыOleg Parinov
 
Четвертое занятие курса iOS-разработки в ГУ-ВШЭ
Четвертое занятие курса iOS-разработки в ГУ-ВШЭЧетвертое занятие курса iOS-разработки в ГУ-ВШЭ
Четвертое занятие курса iOS-разработки в ГУ-ВШЭOleg Parinov
 
2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭ2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭOleg Parinov
 

Más de Oleg Parinov (14)

Технопарк - Управление продуктом - Лекция №2
Технопарк - Управление продуктом - Лекция №2Технопарк - Управление продуктом - Лекция №2
Технопарк - Управление продуктом - Лекция №2
 
Лекция №2 Курса Product Management в НИУ-ВШЭ
Лекция №2 Курса Product Management в НИУ-ВШЭЛекция №2 Курса Product Management в НИУ-ВШЭ
Лекция №2 Курса Product Management в НИУ-ВШЭ
 
Product management - лекция №1
Product management - лекция №1Product management - лекция №1
Product management - лекция №1
 
Pivot + Lean Startup #poSEEDelki Harvest
Pivot + Lean Startup #poSEEDelki HarvestPivot + Lean Startup #poSEEDelki Harvest
Pivot + Lean Startup #poSEEDelki Harvest
 
Instagram Design
Instagram DesignInstagram Design
Instagram Design
 
Start-up Reality Check - Empatika в ВШЭ
Start-up Reality Check - Empatika в ВШЭStart-up Reality Check - Empatika в ВШЭ
Start-up Reality Check - Empatika в ВШЭ
 
Генетические алгоритмы
Генетические алгоритмыГенетические алгоритмы
Генетические алгоритмы
 
Squeek school 2
Squeek school 2Squeek school 2
Squeek school 2
 
Squeek 1
Squeek 1Squeek 1
Squeek 1
 
занятие8
занятие8занятие8
занятие8
 
занятие7
занятие7занятие7
занятие7
 
занятие6
занятие6занятие6
занятие6
 
Четвертое занятие курса iOS-разработки в ГУ-ВШЭ
Четвертое занятие курса iOS-разработки в ГУ-ВШЭЧетвертое занятие курса iOS-разработки в ГУ-ВШЭ
Четвертое занятие курса iOS-разработки в ГУ-ВШЭ
 
2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭ2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭ
 

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