squeek school

Разработка приложений для iOS
http://school.squeek.ru
Паринов Олег
Empatika, Project Manager

Высшая Школа Экономики,
  бизнес-информатика

oleg.parinov@empatika.com
  oparinov
Курс


CS 193P           Факультет бизнес-
                    информатики

                Отделение программной
                      инженерии


          ЗАО ПРОГНОЗ
Литература
            Getting Help
•   Документация
            • The assignment walks you
                through it
•   developer.apple.comlook
              • Key spots to
                 API & Conceptual Docs in Xcode
•
                         ■

    stackoverflow.com files
               ■ Class header




•
               ■ Docs, sample code, tech notes

    Джонатан Здзиарски «iPhone
                 on Apple Developer Connection
                 (ADC) site
    SDK. Разработка приложений»
                   http://developer.apple.com
                              ■

    http://www.ozon.ru/context/
                   Dev site uses Google search
                              ■

    detail/id/4760826/

•   http://school.squeek.ru

             Thursday, January 7, 2010            5
Что в результате?

        Objective-C
         Xcode 4
         iOS SDK


  Foundation    UIKit
    командный проект
что потребуется от вас?
               Mac OS X
                   +
               iOS SDK
                   +
                Xcode
«Герой нашего
  времени»
iPhone
iPod touch
iPad
основы Objective-C
Objective-C

• ООП
• Синтаксис
• Сообщения
• Управление памятью
• Основные классы (NSString, NSArray,
  NSDictionary)
ООП
• Класс
• Объект
• Метод
• Поле
• Инкапсуляция
• Наследование
• Полиморфизм
Классы в Obj-C

• Классы тоже объекты
• Класс - шаблон для объекта
• Класс имеет поля и методы (и свойства)
• Поля скрыты извне - нужны get/set
Наследование в Obj-C
        Inheritance

             Superclass
                                       NSObject



                                       UIControl




              Subclass
                            UIButton               UITextField


        • Hierarchical relation between classes
        • Subclass “inherit” behavior and data from superclass
        • Subclasses can use, augment or replace superclass methods

Thursday, January 7, 2010                                             10
Методы класса и
         объекта
  Class and Instance Methods
• Class and Instance Methods
   Методы объекта (динамические)
  • Instances respond to instance methods
    - (id)init;
    - (float)height;
 • Instances respond to instance methods
    - (void)walk;
   - (id)init;
   - (float)height;
  •-Classes respond to class methods
     (void)walk;

• Методы класса (статические)
    + (id)alloc;
    + (id)person;
 • Classes respond to class methods
    + (Person *)sharedPerson;
   + (id)alloc;
   + (id)person;
   + (Person *)sharedPerson;
Отправка сообщения
         Message syntax
          [receiver message]
Terminology
     [receiver message:argument]
Terminology
• Message expression
          [receiver message:arg1 andArg:arg2]
          [receiver method: argument]
• Message expression
• Message
      [receiver method: argument]
       [receiver method: argument]
• Message
       [receiver method: argument] - сообщение
• Selector
       [receiver method: argument] - cелектор
• Selector
• Method
      [receiver method: argument]
 Thursday, January 7, 2010                       22
Пример
Person *voter;

int theAge = [voter age];

[voter setAge:21];

if ([voter canLegallyVote]) {
  // что-то сделать здесь
}

[voter registerForState:@"CA" party:@"Independant"];

NSString *name = [[voter spouse] name];
стадия дизайна класса
• Создание описания класса - Person
• Определение супер-класса - NSObject
• Какие свойства нужны?
  имя, возраст, может ли голосовать
• Какие действия может выполнять?
  голосовать
Defining a class
   A public header and a private implementation




Класс =                   +
            Header File       Implementation File
заголовок header and a
                        A public
                                        Definin
#import <Foundation/Foundation.h>

@interface Person : NSObject {

// переменные объекта
NSString *name;
int age;
}

// объявление методов
- (NSString *)name;                  Header File
- (void)setName:(NSString *)value;
- (int)age;
- (void)setAge:(int)age;
- (BOOL)canLegallyVote;
- (void)castBallot;

@end
реализация
                      Defining a class
                  A public header and a private implementa
#import "Person.h"

@implementation Person

- (int)age {
return age;
}
- (void)setAge:(int)value {Header File    Implementation File
age = value;
}
//... и остальные методы

@end
вызов собственных
         методов
#import "Person.h"

@implementation Person

- (BOOL)canLegallyVote {
return ([self age] >= 18);
}
- (void)castBallot {
if ([self canLegallyVote]) {
     // голосование
     }
  else { NSLog (@“I’m not allowed to vote!”);
}
@end
Динамическая и
статическая типизация

• Person *person
• id person
ничего


• nil
•   person = nil; [person castBallot];
булевая

•   BOOL flag = NO;

•   if (flag == YES)

•   YES == TRUE == 1

•   NO == FALSE == 0
селектор
id obj;
SEL sel = @selector(start:);
if ([obj respondsToSelector:sel])
{
   [obj performSelector:sel withObject:self];
}
класс объекта

• [myObject class];
• [myObject className];
• [myObject isKindOfClass:[NSString class]];
логирование


• NSLog(@’’Hi there!’’);
• NSLog(@’‘The row number %d’’, rowNumber);
NSString
• Unicode
• @’‘Some string’’
• [NSString stringWithFormat:@’‘It’s %d’’,
  number];
• [string stringByAppendingString:anotherString];
• [string stringByAppendingFormat:
• [string intValue]; [string doubleValue];
NSMutableString

• редактируемая строка
• appendString:
• appendFormat:
• insertString:atIndex:
NSArray

• массив объектов
• count
• objectAtIndex:
• +arrayWithObjects: , , ,nil
• indexOfObject:
NSMutableArray

• addObject:
• removeObject:
• insertObject:AtIndex:
NSDictionary
• objectForKey
• count
• + dictionaryWithObject:forKey:
• + dictionaryWithObjects:forKeys:
• allKeys
• allValues
NSMutableDictionary


• setObject:forKey:
• removeObjectForKey:
вызов суперкласса
• [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

Squeek 1