Фундаментальные
основы разработки
     под iOS
Разработка под iOS

Национальная забава –
бег по полю с граблями
Разработка под iOS
•   Инструменты
•   Основные типы данных
•   Управление памятью
•   UIKit (UIView + UIViewController + UI..)
                            ∞
•   Жизненный цикл приложения
•   Фундаментальные шаблоны в iOS
Инструменты


Xcode   Interface Builder iOS Simulator




          Instruments
Xcode
Xcode
•   Основная среда разработки
•   Обновляется не особо часто
•   Желателен большой экран
•   Последняя версия Xcode 4.2.1 (4.3b)
•   Развивается в странную сторону ;)
•   Есть альтернативы, но они не могут
    полностью заменить Xcode
Interface Builder
Interface Builder
•   WYSIWYG редактор в Xcode
•   Позволяет делать быстрое
    прототипирование
•   Встроен в Xcode
•   Позволяет отвязать представление от
    кода
•   Желателен большой экран
•   В паре с Xcode использует много
    памяти
iOS Simulator
iOS Simulator

•   Незаменим для разработки
•   Использует ресурсы компьютера
•   Позволяет эмулировать различные
    внешние воздействия
•   И все же, не физическое устройство
Instruments
Instruments
•   Показывют события приложения
•   Загрузка CPU, Объем памяти, Сетевая
    Активность, Утечки памяти, Расход
    батареи, UI Automation
•   И многое многое другое
•   Помогает там, где другие инструменты
    бессильны
http://en.wikipedia.org/wiki/Objective-C




Objective-C
Типы данных
•   Ну ооочень много
•   Типы данных из C никуда не делись
•   Есть и Objective-C (просто typedef)
      int              NSInteger
      float            NSUInteger
      bool             CGFloat
      double           ...
      char
      ...
Структуры
Только базовые, которые понадобятся при
              разработке
CGPoint      // x,y

CGSize       // width, height

CGRect       // origin(CGPoint)
             // size(CGSize)

UIEdgeInsets // top, left, bottom, right
Структуры
Для структур - чаще всего есть целая туча
                C-функций
CGPointMake(CGFloat x, CGFloat y)
CGSizeMake(CGFloat width, CGFloat height)

CGRectMake( ... )
CGRectContainsPoint( ... )
CGRectIntersection( ... )
CGRectInset( ... )
Класс
                Интерфейс
@interface SHAppDelegate : UIResponder   {
   Facebook *_facebook;
}

@property (strong) UIWindow *window;
@property (strong) Facebook *facebook;

+ (void)classCoolMethod:(id)params;
- (void)myCoolMethod:(id)params;

@end
Класс
                   Имя
@interface SHAppDelegate : UIResponder   {
   Facebook *_facebook;
}

@property (strong) UIWindow *window;
@property (strong) Facebook *facebook;

+ (void)classCoolMethod:(id)params;
- (void)myCoolMethod:(id)params;

@end
Класс
                 Родитель
@interface SHAppDelegate : UIResponder   {
   Facebook *_facebook;
}

@property (strong) UIWindow *window;
@property (strong) Facebook *facebook;

+ (void)classCoolMethod:(id)params;
- (void)myCoolMethod:(id)params;

@end
Класс
         Внутренние переменные
@interface SHAppDelegate : UIResponder   {
   Facebook *_facebook;
}

@property (strong) UIWindow *window;
@property (strong) Facebook *facebook;

+ (void)classCoolMethod:(id)params;
- (void)myCoolMethod:(id)params;

@end
Класс
                 Свойства
@interface SHAppDelegate : UIResponder   {
   Facebook *_facebook;
}

@property (strong) UIWindow *window;
@property (strong) Facebook *facebook;

+ (void)classCoolMethod:(id)params;
- (void)myCoolMethod:(id)params;

@end
Класс
                  Методы
@interface SHAppDelegate : UIResponder   {
   Facebook *_facebook;
}

@property (strong) UIWindow *window;
@property (strong) Facebook *facebook;

+ (void)classCoolMethod:(id)params;
- (void)myCoolMethod:(id)params;

@end
Класс
        Имплементация (Реализация)
@implementation SHAppDelegate

@synthesize window = _window;
@synthesize facebook = _facebook;

- (void)myCoolMethod:(id)params {
  NSLog(@"Hell'O World");
}

@end
Класс
             Генерация свойств
@implementation SHAppDelegate

@synthesize window = _window;
@synthesize facebook = _facebook;

- (void)myCoolMethod:(id)params {
  NSLog(@"Hell'O World");
}

@end
Класс
            Реализация методов
@implementation SHAppDelegate

@synthesize window = _window;
@synthesize facebook = _facebook;

- (void)myCoolMethod:(id)params {
  NSLog(@"Hell'O World");
}

@end
Протоколы
@protocol MyFriend

- (void)beHonest;
- (void)listenToMe;

@optional

- (void)haveMoney;

@end
Протоколы
            Обязательные методы
@protocol MyFriend

- (void)beHonest;
- (void)listenToMe;

@optional

- (void)haveMoney;

@end
Протоколы
            Опциональные методы
@protocol MyFriend

- (void)beHonest;
- (void)listenToMe;

@optional

- (void)haveMoney;

@end
Категории
@interface NSString (MD5)

 - (NSString*)md5Hash;

@end

@implementation NSString (MD5)

- (NSString*)md5Hash {
  return @"Not implemented yet";
}

@end
Отсылка
сообщения
[object message];


[Class message];
Отсылка сообщения c
      параметрами
User * someUser = [User createUser];

[helper helpUser:someUser];

[helper helpUser:someUser
         withLab:@"23"];
Вложенные вызовы
NSArray * arr =
  [NSArray arrayWithObject:
     [NSArray arrayWithObject:
         [User createUser]
     ]
  ];

[[[NSArray alloc] init] autorelease]
Методы или
селекторы?
Методы или
       селекторы?
SEL sel = @selector(addObject:);
NSMutableArray * arr =
  [NSMutable array];

[arr performSelector:sel
          withObject:@"Cool"];

[arr addObject:@"Cool"];
Методы или
       селекторы?
Селектор - это просто имя
SEL sel = @selector(addObject:);

Его можно создать на этапе выполнения
SEL sel =
NSSelectorFromString(@"addObject:");
Методы или
        селекторы?
Метод - это скомпилированный код

- (void)myCoolMethod:(id)params {
  NSLog(@"Hell'O World");
}

Чаще всего название метода и селектор, при
помощи которого он вызывается, совпадают
Методы или
         селекторы?
Метод всегда знает про селектор, при
помощи которого он был вызван

- (void)myCoolMethod:(id)params {
  // Почти всегда
  // Здесь будет выведено
  // myCoolMethod:
  NSLog(NSStringFromSelector(_cmd));
}
Методы или
       селекторы?
Если нету никакого контекста, то можно
      для простоты считать, что


  Метод == Селектор
Свойства
(Properties)
Properties
@interface MyObj : UIResponder   {
   Facebook *_facebook;
}

@property (retain) UIWindow *window;
@property (copy) Facebook *facebook;

+ (void)classCoolMethod:(id)params;
- (void)myCoolMethod:(id)params;

@end
Properties
@implementation MyObj

@synthesize window = _window;
@synthesize facebook = _facebook;

@end
Properties
                  Getters
@synthesize window = _window;
@synthesize facebook = _facebook;

MyObj * obj = [[MyObj alloc] init];
UIWindow * wnd;

wnd = obj.window;
wnd = [obj window];
Properties
                  Setters
@synthesize window = _window;
@synthesize facebook = _facebook;

MyObj * obj = [[MyObj alloc] init];
UIWindow * wnd = nil;

obj.window = wnd;
[obj setWindow:wnd];
Properties
               Direct Access
@synthesize window = _window;
@synthesize facebook = _facebook;

MyObj * obj = [[MyObj alloc] init];
UIWindow * wnd = nil;

wnd = obj->window;
obj->window = wnd;
   Зачем на свойства           ?
Properties
              Overriden Getter
@synthesize window = _window;
@synthesize facebook = _facebook;


- (UIWindow * )window {
  NSLog(@"Кто-то вызвал getter");
    return _window;
}
Properties
              Overriden Setter
@synthesize window = _window;
@synthesize facebook = _facebook;

- (void)setWindow:(UIWindow*)w {
  if (w != nil) {
     _window = w;
  } else {
    NSLog(@"Не-не-не, Д.Б.!");
  }
}
Properties
              Overriden Setter
@synthesize window = _window;
@synthesize facebook = _facebook;

- (void)setWindow:(UIWindow*)w {
  if (w != nil) {        Только с
     _window = w;
  } else {                  ARC
    NSLog(@"Не-не-не, Д.Б.!");
  }
}
ARC?
 О_о
Работа с памятью
    Memory
  management
Работа с памятью
          Это просто!
            releas      autoreleas
 retain        e            e



                     alloc
           copy                  new
 deallo
   c
Работа с памятью
• Объект живет, если на него есть хоть
одна ссылка
• На каждый объект может быть
несколько ссылок
• Как только количество ссылок на
объект равно нулю, он удаляется из
памяти
Работа с памятью
      Жизнь замечательных объектов



alloc

                       Создание
                   в ручном режиме
new
Работа с памятью
      Жизнь замечательных объектов



alloc            release

                                 Жизнь
                      autorele
             retain
                        ase
new
                  copy
Работа с памятью
      Жизнь замечательных объектов



alloc            release


                                      dealloc
                      autorele
             retain
                        ase
new
                                   Уничтожение
                  copy
                                 "автоматически"
Работа с памятью
   Жизнь замечательных объектов
Вызывать метод dealloc в ручную,
           нельзя!

 Если вы, все же, это сделали, то
  перечитайте еще раз Memory
          Management.
Работа с памятью
  Жизнь замечательных объектов
 Метод     Изменение Количество
   alloc      +1         1
   new        +1         1
   copy       +1*        ∞
  retain      +1         ∞
  release     -1         ∞
autorelease   -1*        ∞
  dealloc     0          1
Работа с памятью
               Создание
 Метод        Изменение   Количество
   alloc         +1           1
   new           +1           1
   copy          +1*          ∞
  retain         +1           ∞
  release        -1           ∞
autorelease      -1*          ∞
  dealloc         0           1
Работа с памятью
                Жизнь
 Метод        Изменение   Количество
   alloc         +1           1
   new           +1           1
   copy          +1*          ∞
  retain         +1           ∞
  release        -1           ∞
autorelease      -1*          ∞
  dealloc         0           1
Работа с памятью
  Жизнь замечательных объектов
 Метод     Изменение Количество
   alloc      +1         1
   new        +1         1
   copy       +1*        ∞
  retain      +1         ∞
  release     -1         ∞
autorelease   -1*        ∞
  dealloc     0          1
Работа с памятью
    Жизнь замечательных объектов
Балансируем вызовы методов, которые
  увеличивают количество ссылок, и
           уменьшают их.

      +1+1+1-1-1+1-1-1+1-1 = 0
Работа с памятью
Жизнь замечательных объектов




Делаем это только в
  СВОЕМ КОДЕ
Работа с памятью
   Жизнь замечательных объектов



Если все делаем правильно, то у нас
   всегда будет хватать памяти
Работа с памятью
     Жизнь замечательных объектов
  Не вызывать методов - тоже баланс :)

- (void)setWindow:(UIWindow*)w {
  if (w != nil) {
     _window = w;
  } else {
    NSLog(@"Не-не-не, Д.Б.!");
  }
}
Работа с памятью
     Жизнь замечательных объектов
         А теперь по честному

- (void)setWindow:(UIWindow*)w {
  [_window autorelease];
  _window = [w retain];
}
Работа с памятью
     Жизнь замечательных объектов
         А теперь по честному

- (void)setWindow:(UIWindow*)w {
  [_window autorelease];
  _window = [w retain];
}
- (void)dealloc {
  [_window release];
  [super dealloc];
}
Работа с памятью
     Жизнь замечательных объектов
          И еще один пример

UIView * v =
[[[UIView alloc] init] autorelease];

UIView * v2 = [[UIView alloc] init];
[v addSubView:v2];
[v2 release];
Работа с памятью
     Жизнь замечательных объектов
          И еще один пример
UIView * v =
[[[UIView alloc] init] autorelease];

UIView * v2 = [[UIView alloc] init];
[v addSubView:v2];
[v2 release];
// Жив ли здесь v2 ?
Работа с памятью
Работа с памятью
Automatic Reference
     Counting
      (ARC)
Работа с памятью


           ARC
Automacic Reference
             Counting
 •   Позволяет избавиться от лишнего кода
 •   Меньше кода - больше разработки ;)
 •   Избавляет от головной боли
 •   Добавляет зубную боль ;)

http://longweekendmobile.com/2011/09/07/objc-
automatic-reference-counting-in-xcode-explained/
Хватит уже о
  памяти!
UIKit
framework
UIKit
Основная библиотека для
 работы с визуальными
     компонентами
UIKit
Громадина
  такая
UIKit

Каждый класс - своя
 отдельная история
UIView
• Все, что отображено на экране
наследуется от UIView
• Каждый view может быть контейнером
для других view
• addSubview:
• removeFromSuperview
UIView
UIViewController
  Основной кирпичик в
построении прикладного
  приложения под iOS
UIViewController
 Model-View-Controller
UIViewController

 А как он выглядит на
        экране?
UIViewController
UIViewController

Много UIView, и ни одного
   UIViewController'a
UIViewController
      Основные задачи
• Загрузка (и выгрузка) вьюх
• Связь вьюх и модели
• Управление UI приложения
• Реагирование на изменение
ориентации экрана
• Реагирование на memory warnings
UIViewController
UIViewController

  Жизненный цикл
UIViewController
          Создание
UIViewController
         Жизнь без
          UIView

           Lazy
          Loading
UIViewController
          dealloc :(

             Не
          интересно
UIViewController
         Жизнь без
          UIView

          (Еще раз)
UIViewController
          Создание
            view
         viewDidLoad
UIViewController
          Жизнь на
           экране
           viewWillAppear
           viewDidAppear
         viewWillDisappear
         viewDidDisappear
UIViewController
          Удаление
            view
         viewDidUnLoad

         Контроллер еще
               жив
UIViewController
         Жизнь без
          UIView

          (Еще раз)
UIViewController
          dealloc :(
UIViewController

        Жизненный цикл

http://habrahabr.ru/blogs/macosxdev/129557/
UIKit
•   UIViewController
•   UINavigationController
•   UITabBarController
•   UIScrollView
•   UITableView
•   UIButton
Где искать ответы?

developer.apple.com/iphone




   google.com                habrahabr.ru
Спасибо за внимание!

Тайкало Павел

email : ptaykalo@stanfy.com.ua
skype : tt.kilew
site : http://stanfy.com.ua

More Related Content

PPTX
C#. От основ к эффективному коду
PDF
Basis.js – «под капотом»
PDF
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
PPTX
Поговорим о JavaScript, основы и современные тенденции развития языка
PDF
JavaScript Базовый. Занятие 11.
PDF
Инструменты разные нужны, инструменты разные важны
PDF
Лекция #5. Введение в язык программирования Python 3
PDF
Жизнь в изоляции
C#. От основ к эффективному коду
Basis.js – «под капотом»
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
Поговорим о JavaScript, основы и современные тенденции развития языка
JavaScript Базовый. Занятие 11.
Инструменты разные нужны, инструменты разные важны
Лекция #5. Введение в язык программирования Python 3
Жизнь в изоляции

What's hot (20)

PPTX
Convert this: peculiarities of cross-platform mobile game development at Vizor
PPT
Подробная презентация JavaScript 6 в 1
PDF
Влад Ковташ — Yap Database
PPTX
Максим Щепелин. "Unittesting. Как?"
PPT
Подробная презентация JavaScript 6 в 1
PPT
Толстая модель. История разработки ORM
PPT
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
PPT
Javascript
PDF
Лекция 12. Быстрее, Python, ещё быстрее.
PDF
Интуит. Разработка приложений для iOS. Лекция 5. Сложные Views
PDF
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
PPT
Web весна 2013 лекция 9
PDF
Лекция 13. Многопоточность и GIL
PDF
Лекция 5. Встроенные коллекции и модуль collections.
PDF
Лекция 8. Итераторы, генераторы и модуль itertools.
PDF
Лекция 10. Классы 2.
PDF
"Рекомендации по проектированию API" — Марина Степанова, Яндекс
PDF
Лекция 2. Всё, что вы хотели знать о функциях в Python.
PDF
Лекция 9. Модули, пакеты и система импорта.
PDF
Лекция 1. Начало.
Convert this: peculiarities of cross-platform mobile game development at Vizor
Подробная презентация JavaScript 6 в 1
Влад Ковташ — Yap Database
Максим Щепелин. "Unittesting. Как?"
Подробная презентация JavaScript 6 в 1
Толстая модель. История разработки ORM
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
Javascript
Лекция 12. Быстрее, Python, ещё быстрее.
Интуит. Разработка приложений для iOS. Лекция 5. Сложные Views
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
Web весна 2013 лекция 9
Лекция 13. Многопоточность и GIL
Лекция 5. Встроенные коллекции и модуль collections.
Лекция 8. Итераторы, генераторы и модуль itertools.
Лекция 10. Классы 2.
"Рекомендации по проектированию API" — Марина Степанова, Яндекс
Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 9. Модули, пакеты и система импорта.
Лекция 1. Начало.
Ad

Similar to Фундаментальные основы разработки под iOS. Павел Тайкало (20)

PDF
Архитектура в Agile: слабая связность
PPTX
automation is iOS development
PDF
Mobile automation uamobile
PPTX
iOS and Android Mobile Test Automation
PDF
Чуть сложнее чем Singleton: аннотации, IOC, АОП
PPTX
Javascript 1
KEY
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
PDF
Интуит. Разработка приложений для iOS. Лекция 3. Views
PDF
Behat в PHP с использованием Behat и Mink
PDF
SPA инструменты
PPT
Easy authcache 2 кеширование для pro родионов игорь
PPT
Easy authcache 2 кэширование для pro. Родионов Игорь
PPTX
Node.js введение в технологию, КПИ #ITmeetingKPI
PDF
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
PPTX
Bytecode
PDF
UWDC 2013, Yii2
PDF
Инструментируй это
PDF
Систематизация экспрешнов в IE
PPT
Профилирование и оптимизация jQuery–кода
Архитектура в Agile: слабая связность
automation is iOS development
Mobile automation uamobile
iOS and Android Mobile Test Automation
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Javascript 1
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Интуит. Разработка приложений для iOS. Лекция 3. Views
Behat в PHP с использованием Behat и Mink
SPA инструменты
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
Node.js введение в технологию, КПИ #ITmeetingKPI
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Bytecode
UWDC 2013, Yii2
Инструментируй это
Систематизация экспрешнов в IE
Профилирование и оптимизация jQuery–кода
Ad

More from Stanfy (17)

PDF
Case Study Food&Wine Mobile App
PDF
Продвижение алкогольных брендов с помощью мобильных приложений
PDF
Stanfy. Портфолио
PPTX
Украина и мобаил. Быть или не быть?
PPTX
Предыстория, Тенденции, Платформа и Начало. Павел Башмаков
PPT
Розробка під Android. Роман Мазур
PPT
Основні поняття Android. Роман Мазур
PPTX
Один в поле не воин, и чего ищут пользователи. Андрей Гаркавый
PDF
И снова разработка под iOS. Павел Тайкало
PPT
Prototype like God. Анна Мининкова
PPTX
Один в поле не воин, и чего ищут пользователи. Андрей Гаркавый
PPTX
Предыстория,тенденции, платформа и начало. Павел Башмаков
PDF
About Stanfy in Forbes Ukraine
PPTX
Mobile News iPhone/iPad/Android - application development platform for web si...
PPTX
Mobile News - Платформа для создания iPhone/iPad/Android приложений для онлай...
PDF
Mobile Shopper Insights for 2011
PDF
Ukraine Business Insight
Case Study Food&Wine Mobile App
Продвижение алкогольных брендов с помощью мобильных приложений
Stanfy. Портфолио
Украина и мобаил. Быть или не быть?
Предыстория, Тенденции, Платформа и Начало. Павел Башмаков
Розробка під Android. Роман Мазур
Основні поняття Android. Роман Мазур
Один в поле не воин, и чего ищут пользователи. Андрей Гаркавый
И снова разработка под iOS. Павел Тайкало
Prototype like God. Анна Мининкова
Один в поле не воин, и чего ищут пользователи. Андрей Гаркавый
Предыстория,тенденции, платформа и начало. Павел Башмаков
About Stanfy in Forbes Ukraine
Mobile News iPhone/iPad/Android - application development platform for web si...
Mobile News - Платформа для создания iPhone/iPad/Android приложений для онлай...
Mobile Shopper Insights for 2011
Ukraine Business Insight

Фундаментальные основы разработки под iOS. Павел Тайкало

  • 2. Разработка под iOS Национальная забава – бег по полю с граблями
  • 3. Разработка под iOS • Инструменты • Основные типы данных • Управление памятью • UIKit (UIView + UIViewController + UI..) ∞ • Жизненный цикл приложения • Фундаментальные шаблоны в iOS
  • 4. Инструменты Xcode Interface Builder iOS Simulator Instruments
  • 6. Xcode • Основная среда разработки • Обновляется не особо часто • Желателен большой экран • Последняя версия Xcode 4.2.1 (4.3b) • Развивается в странную сторону ;) • Есть альтернативы, но они не могут полностью заменить Xcode
  • 8. Interface Builder • WYSIWYG редактор в Xcode • Позволяет делать быстрое прототипирование • Встроен в Xcode • Позволяет отвязать представление от кода • Желателен большой экран • В паре с Xcode использует много памяти
  • 10. iOS Simulator • Незаменим для разработки • Использует ресурсы компьютера • Позволяет эмулировать различные внешние воздействия • И все же, не физическое устройство
  • 12. Instruments • Показывют события приложения • Загрузка CPU, Объем памяти, Сетевая Активность, Утечки памяти, Расход батареи, UI Automation • И многое многое другое • Помогает там, где другие инструменты бессильны
  • 14. Типы данных • Ну ооочень много • Типы данных из C никуда не делись • Есть и Objective-C (просто typedef) int NSInteger float NSUInteger bool CGFloat double ... char ...
  • 15. Структуры Только базовые, которые понадобятся при разработке CGPoint // x,y CGSize // width, height CGRect // origin(CGPoint) // size(CGSize) UIEdgeInsets // top, left, bottom, right
  • 16. Структуры Для структур - чаще всего есть целая туча C-функций CGPointMake(CGFloat x, CGFloat y) CGSizeMake(CGFloat width, CGFloat height) CGRectMake( ... ) CGRectContainsPoint( ... ) CGRectIntersection( ... ) CGRectInset( ... )
  • 17. Класс Интерфейс @interface SHAppDelegate : UIResponder { Facebook *_facebook; } @property (strong) UIWindow *window; @property (strong) Facebook *facebook; + (void)classCoolMethod:(id)params; - (void)myCoolMethod:(id)params; @end
  • 18. Класс Имя @interface SHAppDelegate : UIResponder { Facebook *_facebook; } @property (strong) UIWindow *window; @property (strong) Facebook *facebook; + (void)classCoolMethod:(id)params; - (void)myCoolMethod:(id)params; @end
  • 19. Класс Родитель @interface SHAppDelegate : UIResponder { Facebook *_facebook; } @property (strong) UIWindow *window; @property (strong) Facebook *facebook; + (void)classCoolMethod:(id)params; - (void)myCoolMethod:(id)params; @end
  • 20. Класс Внутренние переменные @interface SHAppDelegate : UIResponder { Facebook *_facebook; } @property (strong) UIWindow *window; @property (strong) Facebook *facebook; + (void)classCoolMethod:(id)params; - (void)myCoolMethod:(id)params; @end
  • 21. Класс Свойства @interface SHAppDelegate : UIResponder { Facebook *_facebook; } @property (strong) UIWindow *window; @property (strong) Facebook *facebook; + (void)classCoolMethod:(id)params; - (void)myCoolMethod:(id)params; @end
  • 22. Класс Методы @interface SHAppDelegate : UIResponder { Facebook *_facebook; } @property (strong) UIWindow *window; @property (strong) Facebook *facebook; + (void)classCoolMethod:(id)params; - (void)myCoolMethod:(id)params; @end
  • 23. Класс Имплементация (Реализация) @implementation SHAppDelegate @synthesize window = _window; @synthesize facebook = _facebook; - (void)myCoolMethod:(id)params { NSLog(@"Hell'O World"); } @end
  • 24. Класс Генерация свойств @implementation SHAppDelegate @synthesize window = _window; @synthesize facebook = _facebook; - (void)myCoolMethod:(id)params { NSLog(@"Hell'O World"); } @end
  • 25. Класс Реализация методов @implementation SHAppDelegate @synthesize window = _window; @synthesize facebook = _facebook; - (void)myCoolMethod:(id)params { NSLog(@"Hell'O World"); } @end
  • 26. Протоколы @protocol MyFriend - (void)beHonest; - (void)listenToMe; @optional - (void)haveMoney; @end
  • 27. Протоколы Обязательные методы @protocol MyFriend - (void)beHonest; - (void)listenToMe; @optional - (void)haveMoney; @end
  • 28. Протоколы Опциональные методы @protocol MyFriend - (void)beHonest; - (void)listenToMe; @optional - (void)haveMoney; @end
  • 29. Категории @interface NSString (MD5) - (NSString*)md5Hash; @end @implementation NSString (MD5) - (NSString*)md5Hash { return @"Not implemented yet"; } @end
  • 31. Отсылка сообщения c параметрами User * someUser = [User createUser]; [helper helpUser:someUser]; [helper helpUser:someUser withLab:@"23"];
  • 32. Вложенные вызовы NSArray * arr = [NSArray arrayWithObject: [NSArray arrayWithObject: [User createUser] ] ]; [[[NSArray alloc] init] autorelease]
  • 34. Методы или селекторы? SEL sel = @selector(addObject:); NSMutableArray * arr = [NSMutable array]; [arr performSelector:sel withObject:@"Cool"]; [arr addObject:@"Cool"];
  • 35. Методы или селекторы? Селектор - это просто имя SEL sel = @selector(addObject:); Его можно создать на этапе выполнения SEL sel = NSSelectorFromString(@"addObject:");
  • 36. Методы или селекторы? Метод - это скомпилированный код - (void)myCoolMethod:(id)params { NSLog(@"Hell'O World"); } Чаще всего название метода и селектор, при помощи которого он вызывается, совпадают
  • 37. Методы или селекторы? Метод всегда знает про селектор, при помощи которого он был вызван - (void)myCoolMethod:(id)params { // Почти всегда // Здесь будет выведено // myCoolMethod: NSLog(NSStringFromSelector(_cmd)); }
  • 38. Методы или селекторы? Если нету никакого контекста, то можно для простоты считать, что Метод == Селектор
  • 40. Properties @interface MyObj : UIResponder { Facebook *_facebook; } @property (retain) UIWindow *window; @property (copy) Facebook *facebook; + (void)classCoolMethod:(id)params; - (void)myCoolMethod:(id)params; @end
  • 41. Properties @implementation MyObj @synthesize window = _window; @synthesize facebook = _facebook; @end
  • 42. Properties Getters @synthesize window = _window; @synthesize facebook = _facebook; MyObj * obj = [[MyObj alloc] init]; UIWindow * wnd; wnd = obj.window; wnd = [obj window];
  • 43. Properties Setters @synthesize window = _window; @synthesize facebook = _facebook; MyObj * obj = [[MyObj alloc] init]; UIWindow * wnd = nil; obj.window = wnd; [obj setWindow:wnd];
  • 44. Properties Direct Access @synthesize window = _window; @synthesize facebook = _facebook; MyObj * obj = [[MyObj alloc] init]; UIWindow * wnd = nil; wnd = obj->window; obj->window = wnd; Зачем на свойства ?
  • 45. Properties Overriden Getter @synthesize window = _window; @synthesize facebook = _facebook; - (UIWindow * )window { NSLog(@"Кто-то вызвал getter"); return _window; }
  • 46. Properties Overriden Setter @synthesize window = _window; @synthesize facebook = _facebook; - (void)setWindow:(UIWindow*)w { if (w != nil) { _window = w; } else { NSLog(@"Не-не-не, Д.Б.!"); } }
  • 47. Properties Overriden Setter @synthesize window = _window; @synthesize facebook = _facebook; - (void)setWindow:(UIWindow*)w { if (w != nil) { Только с _window = w; } else { ARC NSLog(@"Не-не-не, Д.Б.!"); } }
  • 49. Работа с памятью Memory management
  • 50. Работа с памятью Это просто! releas autoreleas retain e e alloc copy new deallo c
  • 51. Работа с памятью • Объект живет, если на него есть хоть одна ссылка • На каждый объект может быть несколько ссылок • Как только количество ссылок на объект равно нулю, он удаляется из памяти
  • 52. Работа с памятью Жизнь замечательных объектов alloc Создание в ручном режиме new
  • 53. Работа с памятью Жизнь замечательных объектов alloc release Жизнь autorele retain ase new copy
  • 54. Работа с памятью Жизнь замечательных объектов alloc release dealloc autorele retain ase new Уничтожение copy "автоматически"
  • 55. Работа с памятью Жизнь замечательных объектов Вызывать метод dealloc в ручную, нельзя! Если вы, все же, это сделали, то перечитайте еще раз Memory Management.
  • 56. Работа с памятью Жизнь замечательных объектов Метод Изменение Количество alloc +1 1 new +1 1 copy +1* ∞ retain +1 ∞ release -1 ∞ autorelease -1* ∞ dealloc 0 1
  • 57. Работа с памятью Создание Метод Изменение Количество alloc +1 1 new +1 1 copy +1* ∞ retain +1 ∞ release -1 ∞ autorelease -1* ∞ dealloc 0 1
  • 58. Работа с памятью Жизнь Метод Изменение Количество alloc +1 1 new +1 1 copy +1* ∞ retain +1 ∞ release -1 ∞ autorelease -1* ∞ dealloc 0 1
  • 59. Работа с памятью Жизнь замечательных объектов Метод Изменение Количество alloc +1 1 new +1 1 copy +1* ∞ retain +1 ∞ release -1 ∞ autorelease -1* ∞ dealloc 0 1
  • 60. Работа с памятью Жизнь замечательных объектов Балансируем вызовы методов, которые увеличивают количество ссылок, и уменьшают их. +1+1+1-1-1+1-1-1+1-1 = 0
  • 61. Работа с памятью Жизнь замечательных объектов Делаем это только в СВОЕМ КОДЕ
  • 62. Работа с памятью Жизнь замечательных объектов Если все делаем правильно, то у нас всегда будет хватать памяти
  • 63. Работа с памятью Жизнь замечательных объектов Не вызывать методов - тоже баланс :) - (void)setWindow:(UIWindow*)w { if (w != nil) { _window = w; } else { NSLog(@"Не-не-не, Д.Б.!"); } }
  • 64. Работа с памятью Жизнь замечательных объектов А теперь по честному - (void)setWindow:(UIWindow*)w { [_window autorelease]; _window = [w retain]; }
  • 65. Работа с памятью Жизнь замечательных объектов А теперь по честному - (void)setWindow:(UIWindow*)w { [_window autorelease]; _window = [w retain]; } - (void)dealloc { [_window release]; [super dealloc]; }
  • 66. Работа с памятью Жизнь замечательных объектов И еще один пример UIView * v = [[[UIView alloc] init] autorelease]; UIView * v2 = [[UIView alloc] init]; [v addSubView:v2]; [v2 release];
  • 67. Работа с памятью Жизнь замечательных объектов И еще один пример UIView * v = [[[UIView alloc] init] autorelease]; UIView * v2 = [[UIView alloc] init]; [v addSubView:v2]; [v2 release]; // Жив ли здесь v2 ?
  • 69. Работа с памятью Automatic Reference Counting (ARC)
  • 71. Automacic Reference Counting • Позволяет избавиться от лишнего кода • Меньше кода - больше разработки ;) • Избавляет от головной боли • Добавляет зубную боль ;) http://longweekendmobile.com/2011/09/07/objc- automatic-reference-counting-in-xcode-explained/
  • 72. Хватит уже о памяти!
  • 74. UIKit Основная библиотека для работы с визуальными компонентами
  • 76. UIKit Каждый класс - своя отдельная история
  • 77. UIView • Все, что отображено на экране наследуется от UIView • Каждый view может быть контейнером для других view • addSubview: • removeFromSuperview
  • 79. UIViewController Основной кирпичик в построении прикладного приложения под iOS
  • 81. UIViewController А как он выглядит на экране?
  • 83. UIViewController Много UIView, и ни одного UIViewController'a
  • 84. UIViewController Основные задачи • Загрузка (и выгрузка) вьюх • Связь вьюх и модели • Управление UI приложения • Реагирование на изменение ориентации экрана • Реагирование на memory warnings
  • 87. UIViewController Создание
  • 88. UIViewController Жизнь без UIView Lazy Loading
  • 89. UIViewController dealloc :( Не интересно
  • 90. UIViewController Жизнь без UIView (Еще раз)
  • 91. UIViewController Создание view viewDidLoad
  • 92. UIViewController Жизнь на экране viewWillAppear viewDidAppear viewWillDisappear viewDidDisappear
  • 93. UIViewController Удаление view viewDidUnLoad Контроллер еще жив
  • 94. UIViewController Жизнь без UIView (Еще раз)
  • 95. UIViewController dealloc :(
  • 96. UIViewController Жизненный цикл http://habrahabr.ru/blogs/macosxdev/129557/
  • 97. UIKit • UIViewController • UINavigationController • UITabBarController • UIScrollView • UITableView • UIButton
  • 99. Спасибо за внимание! Тайкало Павел email : [email protected] skype : tt.kilew site : http://stanfy.com.ua