SlideShare ist ein Scribd-Unternehmen logo
1 von 163
Программирование
     под iOS
В программе
• Objective C
• Foundation and Memory Management
• Views and View Controllers
• Interface builder
• Networking
• Web services, JSON
• ...
Организация занятий


• Немного теории
• Много практики
Занятие 1
Objective C как очередной язык
Кратко
• Основные особенности языка
• Объявления и определения классов
• Инициализация и деинициализация
• Управление памятью
• Properties
• Стандартные классы
• Стиль форматирования и именование
• Практика: простенькое приложеньеце
Кратко

• Селекторы
• Протоколы
• Делегаты
• Практика: xml parsing
iOS Developer Library
• Guides
 • View Controller Guide for iOS
 • Table View Programming Guide for iOS
 • ...
• References
 • UIView
 • UIViewController
 • ...
Что является основным
инструментом разработчика?
Google
Основные особенности
     Objective C
Основные особенности


• Расширение C
• Совместимость с C++
• Динамическая типизация
• Управление памятью
Расширение C

• Можно использовать базовые типы,
  массивы и структуры
• Можно вызывать функции
• Можно работать с указателями
• ...
Совместимость с C++
• Objective C класс может ссылаться на
  C++ и наоборот
• В теле методов можно вызывать методы
  как Objective C классов, так и C++
• Objective C классы могут быть
  использованы в качестве аргументов
  шаблонов
Элементарные типы


• int, unsigned int
• NSInteger, NSUInteger
Классы и объекты


• NSObject *obj
• NSString *str, NSArray *arr, UIView *view
Динамическая
       типизация
• Динамическое связывание
• id
• При невозможности проверить наличие
  метода - предупреждение, а не ошибка
• Сообщения
• Возможность интроспекции
Классы и методы
Исходные файлы
•   Order.h - объявление

•   Order.m - определение
Объявление
Objective C                    Java


@interface Printer : Staff {   class Printer extends Staff{

}



@end                           }
Объявление
Objective C                    Java


@interface Printer : Staff {   class Printer extends Staff{

}



@end                           }
Объявление
Objective C                    Java


@interface Printer : Staff {   class Printer extends Staff{

}



@end                           }
Объявление
Objective C                    Java


@interface Printer : Staff {   class Printer extends Staff{
  int pages;                     int pages;
}



@end                           }
Объявление
Objective C                    Java


@interface Printer : Staff {   class Printer extends Staff{
  int pages;                     int pages;
}



@end                           }
Объявление
Objective C                             Java


@interface Printer : Staff {            class Printer extends Staff{
  int pages;                              int pages;
}

- (void)print:(NSString *)a b:(int)b;     public void print(String a, int b) {
                                          };
@end                                    }
Объявление
Objective C                             Java


@interface Printer : Staff {            class Printer extends Staff{
  int pages;                              int pages;
}

- (void)print:(NSString *)a b:(int)b;     public void print(String a, int b) {
                                          };
@end                                    }
Объявление
Objective C                             Java


@interface Printer : Staff {            class Printer extends Staff{
  int pages;                              int pages;
}

- (void)print:(NSString *)a b:(int)b;     public void print(String a, int b) {
                                          };
@end                                    }
Объявление
Objective C                             Java


@interface Printer : Staff {            class Printer extends Staff{
  int pages;                              int pages;
}

- (void)print:(NSString *)a b:(int)b;     public void print(String a, int b) {
                                          };
@end                                    }
Объявление
Objective C                             Java


@interface Printer : Staff {            class Printer extends Staff{
  int pages;                              int pages;
}

- (void)print:(NSString *)a b:(int)b;     public void print(String a, int b) {
                                          };
@end                                    }
Объявление
Objective C                             Java


@interface Printer : Staff {            class Printer extends Staff{
  int pages;                              int pages;
}

- (void)print:(NSString *)a b:(int)b;     public void print(String a, int b) {
                                          };
@end                                    }
Объявление
Objective C                             Java


@interface Printer : Staff {            class Printer extends Staff{
  int pages;                              int pages;
}

- (void)print:(NSString *)a b:(int)b;     public void print(String a, int b) {
                                          };
@end                                    }
Объявление


- (void)print:(NSString *)a b:(int)b;
Объявление


    - (void)print:(NSString *)a b:(int)b;


Non-static
 метод
Объявление
Тип возвращаемого
     значения




    - (void)print:(NSString *)a b:(int)b;


Non-static
 метод
Объявление
Тип возвращаемого
     значения




    - (void)print:(NSString *)a b:(int)b;


Non-static
                     Имя функции
 метод
Объявление
Тип возвращаемого
                    Тип аргумента    Тип аргумента
     значения




    - (void)print:(NSString *)a b:(int)b;


Non-static             Имя функции
 метод                   print:b:
Объявление
Тип возвращаемого
                    Тип аргумента    Тип аргумента
     значения




    - (void)print:(NSString *)a b:(int)b;


Non-static             Имя функции      Имена
 метод                   print:b:     аргументов
Определение
Objective C               Java
@implementation Printer




@end
Определение
    Objective C                          Java
@implementation Printer

- (void)print:(NSString *)a b:(int)b {     public void print(String a, int b){
                                             
}                                          };

@end
Определение
    Objective C                          Java
@implementation Printer

- (void)print:(NSString *)a b:(int)b {     public void print(String a, int b){
                                             
}                                          };

@end
Вызов методов
 Objective C                        Java


[obj print];                        obj.print();

[obj printData:data];               obj.printData(data);

[obj printData:data withFormat:frm]; obj.printDataWithFormat(data, frm)
Цепочка вызовов
 Objective C                           Java

[[[view show] hide] showAgain];        view.show().hide().showAgain();

[[obj dict]                            obj.getDict().
  objectForKey:[NSNumber intValue]];    getObjectForKey(num.intValue());
Статические функции
Objective C                    Java

                               class Printer extends Staff{
@interface Printer : Staff {

}
                                 public static Object
+ (id)sharedPrinter;
                                             getSharedPrinter {
                                 };
@end
                               }
Singletone
Objective C
static Printer* sharedPrinter_;

+ (id)sharedPrinter {
 if (sharedPrinter_ == nil) {
   sharedPrinter_ = [[Printer alloc] init];
 }

    return sharedPrinter_;
}
“Конструктор” и
  “деструктор”
- (id)init {

 self = [super init];

 if (self != nil) {

 
 ...

 }

 return self;
}

- (void)dealloc {

 ...

 [super dealloc];
}
Произвольный тип



- (id)init {

 self = [super init];

 if (self != nil) {

 
 ...

 }

 return self;
}

- (void)dealloc {

 ...

 [super dealloc];
}
Произвольный тип

                         Родительский объект
- (id)init {

 self = [super init];

 if (self != nil) {

 
 ...

 }

 return self;
}

- (void)dealloc {

 ...

 [super dealloc];
}
Произвольный тип

                         Родительский объект
- (id)init {

 self = [super init];

 if (self != nil) {

 
 ...                       Инициализация


 }

 return self;
}

- (void)dealloc {

 ...

 [super dealloc];
}
Произвольный тип

                         Родительский объект
- (id)init {

 self = [super init];

 if (self != nil) {

 
 ...                     Инициализация


 }

 return self;
}                     Текущий объект
                           (this)


- (void)dealloc {

 ...

 [super dealloc];
}
Произвольный тип

                         Родительский объект
- (id)init {

 self = [super init];

 if (self != nil) {

 
 ...                     Инициализация


 }

 return self;
}                     Текущий объект
                           (this)


- (void)dealloc {
                        Зарезервированное имя

 ...

 [super dealloc];
}
Произвольный тип

                         Родительский объект
- (id)init {

 self = [super init];

 if (self != nil) {

 
 ...                     Инициализация


 }

 return self;
}                     Текущий объект
                           (this)


- (void)dealloc {
                        Зарезервированное имя

 ...

 [super dealloc];
                          Освобождение
}                           ресурсов
Создание
 Objective C                                 Java


TestClass *obj = [[TestClass alloc] init];   TestClass obj = new TestClass();
Инициализаторы
- (id)initWithThis:(NSObject *)this;

- (id)initWithThat:(NSObject *)that;

- (id)initWithThis:(NSObject *)this
           andThat:(NSObject *)that;
Управление памятью
Reference counting
•   alloc
 
   +1

•   retain
    +1

•   release
 -1

    •   при 0 вызывается
        dealloc


•   retainCount
Управление памятью

Order *order = [[Order alloc] init];   1
[order retain];                        2
[order release];                       1
[order release];                       0
Управление памятью

Order *order = [[Order alloc] init];   1
[order retain];                        2
[order release];                       1
[order release];                       0


[order retainCount]:   1
Управление памятью

Order *order = [[Order alloc] init];   1
[order retain];                        2
[order release];                       1
[order release];                       0


[order retainCount]:   2
Управление памятью

Order *order = [[Order alloc] init];   1
[order retain];                        2
[order release];                       1
[order release];                       0


[order retainCount]:   1
Управление памятью

Order *order = [[Order alloc] init];   1
[order retain];                        2
[order release];                       1
[order release];                       0


[order retainCount]:   0
Управление памятью

Order *order = [[Order alloc] init];   1
[order retain];                        2
[order release];                       1
[order release];                       0
Autorelease pool

• NSAutoreleasePool
• [object autorelease]
• [pool drain]
Autorelease pool


  pool
Autorelease pool
[object autorelease]




             pool
Autorelease pool
[object autorelease]



                       retain
             pool               object
Autorelease pool


  pool     object
Autorelease pool
[pool drain]




               pool   object
Autorelease pool
[pool drain]



                      release
               pool             object
Autorelease pool
- (void)buttonTouched {
  Order* order = [[Order alloc] init];
  ...
  [order release];
}
Autorelease pool
- (void)buttonTouched {
  Order* order = [[[Order alloc] init] autorelease];
   ...
}
Static initializers

NSArray *array = [[[NSArray] alloc] init] autorelease];
Static initializers

NSArray *array = [NSArray array];
Autorelease pool
- (void)f {

    NSAray *array = [self itemsList];




    [array doSomething];
}
Autorelease pool
- (void)f {

    NSAray *array = [self itemsList];
                                        - (NSArray *)itemsList {
                                           [[[NSArray alloc] init]
                                               autorelease];
                                           ...
                                           return array;
                                        }
    [array doSomething];
}
Properties
Properties (dot notation)
NSArray *itemsList = [order itemsList];

[order setItemsList:itemsList];
Properties (dot notation)
NSArray *itemsList = order.itemsList;

order.itemsList = itemsList;




                                         Появилось в
                                        Objective C 2.0
Properties (dot notation)
NSArray *itemsList = order.itemsList;

order.itemsList = itemsList;
                                       Вызывает
                                   [order itemsList];




                                         Появилось в
                                        Objective C 2.0
Properties (dot notation)
NSArray *itemsList = order.itemsList;

order.itemsList = itemsList;
                                         Вызывает
                                     [order itemsList];


                  Вызывает
             [order setItemsList];




                                         Появилось в
                                        Objective C 2.0
Properties (dot notation)
order.itemsList

@interface Order : NSObject {

}




@end
Properties (dot notation)
order.itemsList ~ [order itemsList]

@interface Order : NSObject {
  NSArray *itemsList
}




@end
Properties (dot notation)
order.itemsList ~ [order itemsList]

@interface Order : NSObject {
  NSArray *itemsList
}

 -(NSArray *)itemsList;
 -(void)setItemsList:(NSArray *)itemsList;

@end
Properties (dot notation)
order.itemsList ~ [order itemsList]

@interface Order : NSObject {
  NSArray *itemsList
}

@property (...) NSArray *itemsList;


@end
Properties (dot notation)
@implementation Order




@end
Properties (dot notation)
@implementation Order

- (NSArray *)itemsList {

}

- (void)itemsList:(NSArray *)itemsList {

}
@end
Properties (dot notation)
@implementation Order

- (NSArray *)itemsList {
   return self->itemsList;
}

- (void)itemsList:(NSArray *)itemsList {
  self->itemsList = itemsList;
}
@end
Properties (dot notation)
@implementation Order

@synthesize itemsList;




@end
Properties (dot notation)
@property (retain) NSArray *itemsList;

@property (assign) int count;

@property (readonly, retain) NSArray *itemsList;

@property (copy) NSString *string;
Properties (dot notation)
Order.h
@interface Order : NSObject {
  NSArray *itemsList
}
@property (retain) NSArray *itemsList;
@end
Order.m
@implementation Order
@synthesize itemsList;
@end
Стандартные классы
NSString

NSString *string = @”static string”;

NSString *formatString = [NSString
 stringWithFormat:@”%d - %@”, count, description];
NSNumber

NSNumber *num = [NSNumber numberWithInt:5];

NSInteger intNum = [num intValue];
NSArray
NSArray *array = [NSArray array]; // alloc, init, a/r

NSUInteger count = [array count];

Order *order = (Order *)[array objectAtIndex:0];

for (Order* order in array) {
  ...
}
NSMutableArray
NSMutableArray *itemsList = [NSMutableArray array];

[itemsList addObject:item];

[itemsList removeObject:item];
NSDictionary
NSDictionary *dict = [order someDictionary];

NSNumber *count = [dict objectForKey:@”fruits”];

if (![[dict allKeys] contains:@”testKey”]) ...

for (NSString *key in dict) {
  id value = [dict objectForKey:key];
}
NSMutableDictionary
NSMutableDictionary *dict =
          [NSMutableDictionary dictonary];

[dict setObject:obj forKey:@”test”];

[dict removeObjectForKey:
            [NSNumber numberWithInt:5]];
Стиль
форматирования
Стиль форматирования

@interface NSString : NSObject {
}

- (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc;

@end
Стиль форматирования

@interface NSString : NSObject {
}

- (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc;

@end
Пробел только здесь
Стиль форматирования

@interface NSString : NSObject {
}

- (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc;

@end
                                           Звездочка рядом с
Пробел только здесь                   переменной, а не с типом, как
                                           принято в C/C++
Стиль форматирования

- (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc {
    if (member != nil) {
      for (NSNumber *num in array) {
        [num stringValue];
      }
    }
}
Стиль форматирования
    Пробел только здесь


- (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc {
    if (member != nil) {
      for (NSNumber *num in array) {
        [num stringValue];
      }
    }
}
Стиль форматирования
                                                 Открывающая скобка на
    Пробел только здесь
                                                     той же строке

- (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc {
    if (member != nil) {
      for (NSNumber *num in array) {
        [num stringValue];
      }
    }
}
Стиль форматирования
                                                 Открывающая скобка на
    Пробел только здесь
                                                     той же строке

- (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc {
    if (member != nil) {
      for (NSNumber *num in array) {
        [num stringValue];
      }
    }              В именах функций и
                  переменных camel-case
}
Стиль форматирования
                                                 Открывающая скобка на
    Пробел только здесь
                                                     той же строке

- (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc {
    if (member != nil) {
      for (NSNumber *num in array) {
        [num stringValue];                    Приняты длинные имена
      }
    }              В именах функций и
                  переменных camel-case
}
Стиль форматирования


• Coding Guidelines for Cocoa
• Стандартные заголовочные файлы
Кратко
• Основные особенности языка
• Объявления и определения классов
• Инициализация и деинициализация
• Управление памятью
• Properties
• Стандартные классы
• Стиль форматирования и именование
• Практика: простенькое приложеньеце
XCode Demo
Практика
Order
  NSUInteger orderId
  NSMutableArray *items

OrderItem
  NSString *description
  NSUInteger price

OrdersManager
  - (NSArray *)createOrders;
  - (void)printOrders;   // NSLog(...)
Кратко


• Селекторы
• Протоколы
• Делегаты
Селекторы
Селекторы

• Аналог указателя на функцию
• SEL s = @selector(<method name>)
• [obj performSelector:s]
Селекторы
OrderProcessor   OrderProcessor
    Client
Селекторы
OrderProcessor   OrderProcessor
    Client
                 - processOrder
Селекторы
OrderProcessor   OrderProcessor
    Client
                 - processOrder
Селекторы
OrderProcessor.h
@interface OrderProcessor : NSObject {
  id target;
  SEL callback;
}

- (void)processData:(NSData *)data
              target:(id)target
            selector:(SEL)selector;

@end
Вызываемый класс
                    Селекторы
OrderProcessor.h
@interface OrderProcessor : NSObject {
  id target;
  SEL callback;
}

- (void)processData:(NSData *)data
              target:(id)target
            selector:(SEL)selector;

@end
Вызываемый класс
                    Селекторы
OrderProcessor.h
@interface OrderProcessor : NSObject {
  id target;
  SEL callback;
}     Объявление типа
        селектора

- (void)processData:(NSData *)data
              target:(id)target
            selector:(SEL)selector;

@end
Вызываемый класс
                    Селекторы
OrderProcessor.h
@interface OrderProcessor : NSObject {
  id target;
  SEL callback;
}     Объявление типа
        селектора
                                      Функция обработки
- (void)processData:(NSData *)data    принимает ссылку на
              target:(id)target            объект ...

            selector:(SEL)selector;

@end
Вызываемый класс
                    Селекторы
OrderProcessor.h
@interface OrderProcessor : NSObject {
  id target;
  SEL callback;
}     Объявление типа
        селектора
                                      Функция обработки
- (void)processData:(NSData *)data    принимает ссылку на
              target:(id)target            объект ...

            selector:(SEL)selector;
                                        ... и на селектор

@end
Селекторы
OrderProcessorClient.m

- (void)f {
  [orderProcessor processData:data target:self
              selector:@selector(orderProcessed:)];
}

- (void)orderProcessed:(id)source {
  ...
}
Вызывающий класс   Селекторы
OrderProcessorClient.m

- (void)f {
  [orderProcessor processData:data target:self
              selector:@selector(orderProcessed:)];
}

- (void)orderProcessed:(id)source {
  ...
}
Вызывающий класс   Селекторы
OrderProcessorClient.m
                                      Передает себя в
                                      качестве объекта
- (void)f {
  [orderProcessor processData:data target:self
              selector:@selector(orderProcessed:)];
}

- (void)orderProcessed:(id)source {
  ...
}
Вызывающий класс   Селекторы
OrderProcessorClient.m
                                      Передает себя в
                                      качестве объекта
- (void)f {
  [orderProcessor processData:data target:self
              selector:@selector(orderProcessed:)];
}                           и селектор на метод
                               orderProcessed

- (void)orderProcessed:(id)source {
  ...
}
Вызывающий класс   Селекторы
OrderProcessorClient.m
                                      Передает себя в
                                      качестве объекта
- (void)f {
  [orderProcessor processData:data target:self
              selector:@selector(orderProcessed:)];
}                           и селектор на метод
                               orderProcessed

- (void)orderProcessed:(id)source {
  ...                                     Важно! Помним про
                                        составные имена методов
}
Селекторы
OrderProcessor.m

- (void)processData:(NSData *)data
               target:(id)aTarget
            selector:(SEL)aSelector {
  target = aTarget;
  selector = aSelector;
  ...
  [target performSelector:selector];
}
Вызывемый класс
                    Селекторы
OrderProcessor.m

- (void)processData:(NSData *)data
               target:(id)aTarget
            selector:(SEL)aSelector {
  target = aTarget;
  selector = aSelector;
  ...
  [target performSelector:selector];
}
Вызывемый класс
                    Селекторы
OrderProcessor.m

- (void)processData:(NSData *)data
               target:(id)aTarget
            selector:(SEL)aSelector {
  target = aTarget;
                               Можно при необходимости
  selector = aSelector;           сохранить ссылки
  ...
  [target performSelector:selector];
}
Вызывемый класс
                      Селекторы
OrderProcessor.m

- (void)processData:(NSData *)data
               target:(id)aTarget
            selector:(SEL)aSelector {
  target = aTarget;
                               Можно при необходимости
  selector = aSelector;           сохранить ссылки
  ...
  [target performSelector:selector];
}
                 Использует метод
            performSelector для вызова
Протоколы
Протоколы

• Аналог интерфейсов в других языках
• Объявляет функции
• @protocol
• id<ProtocolName>
Протоколы
@protocol OrderProcessorDelegate

- (void)orderProcessed;

@optional
- (void)orderProcessedWithError:(NSError *)err;

@end
Ключевое слово
                   Протоколы
    @protocol




@protocol OrderProcessorDelegate

- (void)orderProcessed;

@optional
- (void)orderProcessedWithError:(NSError *)err;

@end
Ключевое слово
                   Протоколы
    @protocol
                                      Объявляет только
                                      методы, скобок нет

@protocol OrderProcessorDelegate

- (void)orderProcessed;

@optional
- (void)orderProcessedWithError:(NSError *)err;

@end
Ключевое слово
                     Протоколы
    @protocol
                                         Объявляет только
                                         методы, скобок нет

@protocol OrderProcessorDelegate

- (void)orderProcessed;
                      Можно указать
                   опциональные методы
@optional
- (void)orderProcessedWithError:(NSError *)err;

@end
Протоколы
OrderProcessorClient.h

@interface OrderProcessorClient :
             NSObject<OrderProcessorDelegate> {
}
...
@end
Протоколы
OrderProcessorClient.h            Поддержка протокола
                                 указывается в <скобках>

@interface OrderProcessorClient :
             NSObject<OrderProcessorDelegate> {
}
...
@end
Протоколы
OrderProcessorClient.h            Поддержка протокола
                                 указывается в <скобках>

@interface OrderProcessorClient :
             NSObject<OrderProcessorDelegate> {
}
...
@end        Методы повторно объявлять
                не нужно
Протоколы

id<OrderProcessorDelegate> dlg =
                 [[OrderProcessorClient alloc] init];

[dlg orderProcessed];
Протоколы
      Указатель на протокол
       объявляется как id<>


id<OrderProcessorDelegate> dlg =
                 [[OrderProcessorClient alloc] init];

[dlg orderProcessed];
Протоколы
      Указатель на протокол
                              Звездочка не ставится!
       объявляется как id<>


id<OrderProcessorDelegate> dlg =
                 [[OrderProcessorClient alloc] init];

[dlg orderProcessed];
Делегаты
Делегаты

• Стандартный паттерн с использованием
  протокола
• Используется в Cocoa
• Описывает перечень callback методов
Делегаты
             OrderView
              Delegate


OrderView                OrderView
Controller
Делегаты
             OrderView
              Delegate


OrderView               OrderView
Controller           - delegate
Делегаты
             OrderView
              Delegate


OrderView               OrderView
Controller           - delegate
                     - showOrder
Делегаты
             OrderView
              Delegate


OrderView               OrderView
Controller           - delegate
                     - showOrder
Делегаты
OrderView.h
@protocol OrderViewDelegate;

@interface OrderView : NSObject {
...
@property (...) id<OrderViewDelegate> delegate;
@end

@protocol OrderViewDelegate
- (void)orderViewWillAppear:(OrderView *)ov;
- (void)orderViewDidAppear:(OrderView *)ov;
@end
Объявляются в
используемом классе   Делегаты
OrderView.h
@protocol OrderViewDelegate;

@interface OrderView : NSObject {
...
@property (...) id<OrderViewDelegate> delegate;
@end

@protocol OrderViewDelegate
- (void)orderViewWillAppear:(OrderView *)ov;
- (void)orderViewDidAppear:(OrderView *)ov;
@end
Объявляются в
используемом классе   Делегаты
OrderView.h
@protocol OrderViewDelegate;       Forward declaration


@interface OrderView : NSObject {
...
@property (...) id<OrderViewDelegate> delegate;
@end

@protocol OrderViewDelegate
- (void)orderViewWillAppear:(OrderView *)ov;
- (void)orderViewDidAppear:(OrderView *)ov;
@end
Объявляются в
используемом классе   Делегаты
OrderView.h
@protocol OrderViewDelegate;          Forward declaration


@interface OrderView : NSObject {      Ссылка на делегат
...
@property (...) id<OrderViewDelegate> delegate;
@end

@protocol OrderViewDelegate
- (void)orderViewWillAppear:(OrderView *)ov;
- (void)orderViewDidAppear:(OrderView *)ov;
@end
Объявляются в
используемом классе   Делегаты
OrderView.h
@protocol OrderViewDelegate;           Forward declaration


@interface OrderView : NSObject {      Ссылка на делегат
...
@property (...) id<OrderViewDelegate> delegate;
@end
                                    Объявление протокола

@protocol OrderViewDelegate
- (void)orderViewWillAppear:(OrderView *)ov;
- (void)orderViewDidAppear:(OrderView *)ov;
@end
Делегаты

OrderViewController.h

@interface OrderViewController :
                     NSObject<OrderViewDelegate> {
...
}
@end
Делегаты

OrderViewController.h
                                  Протокол делегата

@interface OrderViewController :
                     NSObject<OrderViewDelegate> {
...
}
@end
Делегаты
OrderViewController.m
@implementation OrderViewController
- (id)init {
   ...
   OrderView *orderView = [OrderView view];
   orderView.delegate = self;
}

// OrderViewDelegate methods
- (void)orderViewWillAppear:(OrderView *)ov {
...
}
@end
Делегаты
OrderViewController.m
@implementation OrderViewController
- (id)init {          Создает OrderView
   ...
   OrderView *orderView = [OrderView view];
   orderView.delegate = self;
}

// OrderViewDelegate methods
- (void)orderViewWillAppear:(OrderView *)ov {
...
}
@end
Делегаты
OrderViewController.m
@implementation OrderViewController
- (id)init {          Создает OrderView
   ...
   OrderView *orderView = [OrderView view];
   orderView.delegate = self;      Устанавливает себя в
}                                     качестве делегата


// OrderViewDelegate methods
- (void)orderViewWillAppear:(OrderView *)ov {
...
}
@end
Делегаты
OrderViewController.m
@implementation OrderViewController
- (id)init {          Создает OrderView
   ...
   OrderView *orderView = [OrderView view];
   orderView.delegate = self;      Устанавливает себя в
}                                     качестве делегата


// OrderViewDelegate methods
- (void)orderViewWillAppear:(OrderView *)ov {
...
}               Делает что-либо при
                      вызове
@end
Делегаты
OrderView.m
@implementation OrderView

- (void)someFunc {
  [delegate orderViewWillAppear:self];
  ...
  [delegate orderViewDidAppear:self];
}

@end
Делегаты
OrderView.m
@implementation OrderView

- (void)someFunc {
  [delegate orderViewWillAppear:self];
  ...                                    Вызов методов делегата
  [delegate orderViewDidAppear:self];
}

@end
Кратко


• Селекторы
• Протоколы
• Делегаты
Практика
<ordersList>
   <order id=1>
    <item price="100.00" title="Помидоры"/>
    <item price="50.00" title="Кока-кола"/>
   </order>
   <order id=2>
    <item price="70.00" title="Огурцы"/>
    <item price="50.00" title="Кока-кола"/>
   </order>
..
</ordersList>
В следующей серии

• View
• ViewController
• Interface Builder
• Первое iOS приложение

Weitere ähnliche Inhalte

Was ist angesagt?

Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковSergey Platonov
 
C++ Базовый. Занятие 02.
C++ Базовый. Занятие 02.C++ Базовый. Занятие 02.
C++ Базовый. Занятие 02.Igor Shkulipa
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x IntroductionFedor Vompe
 
Как это работает: DLR
Как это работает: DLRКак это работает: DLR
Как это работает: DLRMikhail Shcherbakov
 
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++mcroitor
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioAndrey Karpov
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.Igor Shkulipa
 
C++ осень 2013 лекция 9
C++ осень 2013 лекция 9C++ осень 2013 лекция 9
C++ осень 2013 лекция 9Technopark
 
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияPlatonov Sergey
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Yandex
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9Technopark
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksMikhail Kurnosov
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IДмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IPlatonov Sergey
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о BoostSergey Platonov
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному кодуVasiliy Deynega
 
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)Ontico
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
 
C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.Igor Shkulipa
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
C++ осень 2013 лекция 2
C++ осень 2013 лекция 2C++ осень 2013 лекция 2
C++ осень 2013 лекция 2Technopark
 

Was ist angesagt? (20)

Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
 
C++ Базовый. Занятие 02.
C++ Базовый. Занятие 02.C++ Базовый. Занятие 02.
C++ Базовый. Занятие 02.
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x Introduction
 
Как это работает: DLR
Как это работает: DLRКак это работает: DLR
Как это работает: DLR
 
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.
 
C++ осень 2013 лекция 9
C++ осень 2013 лекция 9C++ осень 2013 лекция 9
C++ осень 2013 лекция 9
 
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализация
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IДмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о Boost
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному коду
 
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
 
C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
C++ осень 2013 лекция 2
C++ осень 2013 лекция 2C++ осень 2013 лекция 2
C++ осень 2013 лекция 2
 

Andere mochten auch

HTW-Berlin 28.10.2010
HTW-Berlin 28.10.2010HTW-Berlin 28.10.2010
HTW-Berlin 28.10.20102aid.org
 
FundraisingKongreß 06.04.2011
FundraisingKongreß 06.04.2011FundraisingKongreß 06.04.2011
FundraisingKongreß 06.04.20112aid.org
 
Socialbar Bonn 12.07.2010 Präsentation
Socialbar Bonn 12.07.2010 PräsentationSocialbar Bonn 12.07.2010 Präsentation
Socialbar Bonn 12.07.2010 Präsentation2aid.org
 
занятие 2
занятие 2занятие 2
занятие 2ajantis
 
Social Media für NPOs (Seminar @ prodialog)
Social Media für NPOs (Seminar @ prodialog)Social Media für NPOs (Seminar @ prodialog)
Social Media für NPOs (Seminar @ prodialog)2aid.org
 
BBE Präsentation am 14.06.2010
BBE Präsentation am 14.06.2010BBE Präsentation am 14.06.2010
BBE Präsentation am 14.06.20102aid.org
 
2aid.org Deutscher Kinder-und Jugendhilfetag
2aid.org Deutscher Kinder-und Jugendhilfetag2aid.org Deutscher Kinder-und Jugendhilfetag
2aid.org Deutscher Kinder-und Jugendhilfetag2aid.org
 
Factors explaining the innefficient valuation of intangibles
Factors explaining the innefficient valuation of intangiblesFactors explaining the innefficient valuation of intangibles
Factors explaining the innefficient valuation of intangiblesaccounting2010
 

Andere mochten auch (8)

HTW-Berlin 28.10.2010
HTW-Berlin 28.10.2010HTW-Berlin 28.10.2010
HTW-Berlin 28.10.2010
 
FundraisingKongreß 06.04.2011
FundraisingKongreß 06.04.2011FundraisingKongreß 06.04.2011
FundraisingKongreß 06.04.2011
 
Socialbar Bonn 12.07.2010 Präsentation
Socialbar Bonn 12.07.2010 PräsentationSocialbar Bonn 12.07.2010 Präsentation
Socialbar Bonn 12.07.2010 Präsentation
 
занятие 2
занятие 2занятие 2
занятие 2
 
Social Media für NPOs (Seminar @ prodialog)
Social Media für NPOs (Seminar @ prodialog)Social Media für NPOs (Seminar @ prodialog)
Social Media für NPOs (Seminar @ prodialog)
 
BBE Präsentation am 14.06.2010
BBE Präsentation am 14.06.2010BBE Präsentation am 14.06.2010
BBE Präsentation am 14.06.2010
 
2aid.org Deutscher Kinder-und Jugendhilfetag
2aid.org Deutscher Kinder-und Jugendhilfetag2aid.org Deutscher Kinder-und Jugendhilfetag
2aid.org Deutscher Kinder-und Jugendhilfetag
 
Factors explaining the innefficient valuation of intangibles
Factors explaining the innefficient valuation of intangiblesFactors explaining the innefficient valuation of intangibles
Factors explaining the innefficient valuation of intangibles
 

Ähnlich wie занятие 1

Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CГлеб Тарасов
 
2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭ2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭOleg Parinov
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSГлеб Тарасов
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)AvitoTech
 
Интуит. Разработка приложений для iOS. Лекция 3. Views
Интуит. Разработка приложений для iOS. Лекция 3. ViewsИнтуит. Разработка приложений для iOS. Лекция 3. Views
Интуит. Разработка приложений для iOS. Лекция 3. ViewsГлеб Тарасов
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
 
AlgoCollections (RUS)
AlgoCollections (RUS)AlgoCollections (RUS)
AlgoCollections (RUS)Anton Bukov
 
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...CocoaHeads
 
C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.Igor Shkulipa
 
Memory managment in i os
Memory managment in i osMemory managment in i os
Memory managment in i osit-park
 
Memory managment in i os (1)
Memory managment in i os (1)Memory managment in i os (1)
Memory managment in i os (1)it-park
 
лабораторная работа №4
лабораторная работа №4лабораторная работа №4
лабораторная работа №4Zhanna Kazakova
 
iOS-07_1 Objective-C Blocks
iOS-07_1 Objective-C BlocksiOS-07_1 Objective-C Blocks
iOS-07_1 Objective-C BlocksNoveo
 
iOS-01-Основы Objective-C
iOS-01-Основы Objective-CiOS-01-Основы Objective-C
iOS-01-Основы Objective-CNoveo
 
тема 2.операторы.линейный алгоритм
тема 2.операторы.линейный алгоритмтема 2.операторы.линейный алгоритм
тема 2.операторы.линейный алгоритмdasha2012
 
NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript Dmytro Mindra
 

Ähnlich wie занятие 1 (20)

Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
 
msumobi2. Лекция 1
msumobi2. Лекция 1msumobi2. Лекция 1
msumobi2. Лекция 1
 
msumobi2. Лекция 2
msumobi2. Лекция 2msumobi2. Лекция 2
msumobi2. Лекция 2
 
2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭ2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭ
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)
 
Интуит. Разработка приложений для iOS. Лекция 3. Views
Интуит. Разработка приложений для iOS. Лекция 3. ViewsИнтуит. Разработка приложений для iOS. Лекция 3. Views
Интуит. Разработка приложений для iOS. Лекция 3. Views
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
AlgoCollections (RUS)
AlgoCollections (RUS)AlgoCollections (RUS)
AlgoCollections (RUS)
 
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
 
C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.
 
Memory managment in i os
Memory managment in i osMemory managment in i os
Memory managment in i os
 
Memory managment in i os (1)
Memory managment in i os (1)Memory managment in i os (1)
Memory managment in i os (1)
 
лабораторная работа №4
лабораторная работа №4лабораторная работа №4
лабораторная работа №4
 
iOS-07_1 Objective-C Blocks
iOS-07_1 Objective-C BlocksiOS-07_1 Objective-C Blocks
iOS-07_1 Objective-C Blocks
 
iOS-01-Основы Objective-C
iOS-01-Основы Objective-CiOS-01-Основы Objective-C
iOS-01-Основы Objective-C
 
Modul №2. OOP C++
Modul  №2. OOP C++Modul  №2. OOP C++
Modul №2. OOP C++
 
тема 2.операторы.линейный алгоритм
тема 2.операторы.линейный алгоритмтема 2.операторы.линейный алгоритм
тема 2.операторы.линейный алгоритм
 
NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript
 
Kotlin
KotlinKotlin
Kotlin
 

занятие 1

Hinweis der Redaktion

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. &amp;#x432;&amp;#x44B;&amp;#x437;&amp;#x43E;&amp;#x432; &amp;#x444;&amp;#x443;&amp;#x43D;&amp;#x43A;&amp;#x446;&amp;#x438;&amp;#x438; ~ &amp;#x43E;&amp;#x442;&amp;#x43F;&amp;#x440;&amp;#x430;&amp;#x432;&amp;#x43A;&amp;#x430; &amp;#x441;&amp;#x43E;&amp;#x43E;&amp;#x431;&amp;#x449;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x44F;\nobj = nil, &amp;#x43D;&amp;#x438;&amp;#x447;&amp;#x435;&amp;#x433;&amp;#x43E; &amp;#x43D;&amp;#x435; &amp;#x443;&amp;#x43F;&amp;#x430;&amp;#x434;&amp;#x435;&amp;#x442;\n
  39. &amp;#x432;&amp;#x44B;&amp;#x437;&amp;#x43E;&amp;#x432; &amp;#x444;&amp;#x443;&amp;#x43D;&amp;#x43A;&amp;#x446;&amp;#x438;&amp;#x438; ~ &amp;#x43E;&amp;#x442;&amp;#x43F;&amp;#x440;&amp;#x430;&amp;#x432;&amp;#x43A;&amp;#x430; &amp;#x441;&amp;#x43E;&amp;#x43E;&amp;#x431;&amp;#x449;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x44F;\nobj = nil, &amp;#x43D;&amp;#x438;&amp;#x447;&amp;#x435;&amp;#x433;&amp;#x43E; &amp;#x43D;&amp;#x435; &amp;#x443;&amp;#x43F;&amp;#x430;&amp;#x434;&amp;#x435;&amp;#x442;\n
  40. &amp;#x432;&amp;#x44B;&amp;#x437;&amp;#x43E;&amp;#x432; &amp;#x444;&amp;#x443;&amp;#x43D;&amp;#x43A;&amp;#x446;&amp;#x438;&amp;#x438; ~ &amp;#x43E;&amp;#x442;&amp;#x43F;&amp;#x440;&amp;#x430;&amp;#x432;&amp;#x43A;&amp;#x430; &amp;#x441;&amp;#x43E;&amp;#x43E;&amp;#x431;&amp;#x449;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x44F;\nobj = nil, &amp;#x43D;&amp;#x438;&amp;#x447;&amp;#x435;&amp;#x433;&amp;#x43E; &amp;#x43D;&amp;#x435; &amp;#x443;&amp;#x43F;&amp;#x430;&amp;#x434;&amp;#x435;&amp;#x442;\n
  41. &amp;#x432;&amp;#x44B;&amp;#x437;&amp;#x43E;&amp;#x432; &amp;#x444;&amp;#x443;&amp;#x43D;&amp;#x43A;&amp;#x446;&amp;#x438;&amp;#x438; ~ &amp;#x43E;&amp;#x442;&amp;#x43F;&amp;#x440;&amp;#x430;&amp;#x432;&amp;#x43A;&amp;#x430; &amp;#x441;&amp;#x43E;&amp;#x43E;&amp;#x431;&amp;#x449;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x44F;\nobj = nil, &amp;#x43D;&amp;#x438;&amp;#x447;&amp;#x435;&amp;#x433;&amp;#x43E; &amp;#x43D;&amp;#x435; &amp;#x443;&amp;#x43F;&amp;#x430;&amp;#x434;&amp;#x435;&amp;#x442;\n
  42. &amp;#x432;&amp;#x44B;&amp;#x437;&amp;#x43E;&amp;#x432; &amp;#x444;&amp;#x443;&amp;#x43D;&amp;#x43A;&amp;#x446;&amp;#x438;&amp;#x438; ~ &amp;#x43E;&amp;#x442;&amp;#x43F;&amp;#x440;&amp;#x430;&amp;#x432;&amp;#x43A;&amp;#x430; &amp;#x441;&amp;#x43E;&amp;#x43E;&amp;#x431;&amp;#x449;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x44F;\nobj = nil, &amp;#x43D;&amp;#x438;&amp;#x447;&amp;#x435;&amp;#x433;&amp;#x43E; &amp;#x43D;&amp;#x435; &amp;#x443;&amp;#x43F;&amp;#x430;&amp;#x434;&amp;#x435;&amp;#x442;\n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n
  87. \n
  88. \n
  89. \n
  90. \n
  91. \n
  92. \n
  93. \n
  94. \n
  95. \n
  96. \n
  97. \n
  98. \n
  99. \n
  100. \n
  101. \n
  102. \n
  103. \n
  104. \n
  105. \n
  106. \n
  107. \n
  108. \n
  109. \n
  110. \n
  111. \n
  112. \n
  113. \n
  114. \n
  115. \n
  116. \n
  117. \n
  118. \n
  119. \n
  120. \n
  121. \n
  122. \n
  123. \n
  124. \n
  125. \n
  126. \n
  127. \n
  128. \n
  129. \n
  130. \n
  131. \n
  132. \n
  133. \n
  134. \n
  135. \n
  136. \n
  137. \n
  138. \n
  139. \n
  140. \n
  141. \n
  142. \n
  143. \n
  144. \n
  145. \n
  146. \n
  147. \n
  148. \n
  149. \n
  150. \n
  151. \n
  152. \n
  153. \n
  154. \n
  155. \n
  156. \n
  157. \n
  158. \n
  159. \n
  160. \n
  161. \n
  162. \n
  163. \n
  164. \n
  165. \n
  166. \n
  167. \n
  168. \n
  169. \n
  170. \n
  171. \n