Upgrade to Pro — share decks privately, control downloads, hide ads and more …

iOS: секреты приготовления от Skype

iOS: секреты приготовления от Skype

Презентация выступления Сергея Машкова в рамках образовательной программы HackDay#25 в Нижнем Новгороде

HackDay Russia

April 16, 2013
Tweet

More Decks by HackDay Russia

Other Decks in Technology

Transcript

  1. ТРИ МОДЕЛИ УПРАВЛЕНИЯ ПАМЯТЬЮ •  Garbage collector (MacOS only, deprecated)

    •  Manual memory management •  ARC (Automatic Reference Counting)
  2. MANUAL REFERENCE COUNTING Object Owner A Owner B Owner C

    release release retainCount = 0 release dealloc ç
  3. AUTORELEASE POOLS Object Owner A Owner B Owner C Autorelease

    Pool Owns release retainCount = 3 Owns
  4. AUTORELEASE POOLS Pool 3 Pool 2 Pool 1 Pool Stack

    Top (current Autorelease Pool) Bottom (usually thread’s one)
  5. AUTORELEASE POOLS NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSString *string1

    = @”mySuperString”; NSString *string2 = [[[NSString alloc] initWithUTF8String: “mySuperString”] autorelease]; [pool release];
  6. Владеете объектом: •  … alloc] init]; •  … copy]; • 

    … new]; •  … retain]; Не владеете объектом: •  Во всех остальных случаях например: •  [NSString stringWith… …]; •  object.property; •  … release]; •  … autorelease]; СТАНДАРТНЫЕ СОГЛАШЕНИЯ
  7. AUTOMATED REFERENCE COUNTING •  Компилятор занимается управлением памятью самостоятельно; • 

    Задача программиста – указать факт владения / не владения; •  strong/weak references для полей и свойств.
  8. AUTOMATED REFERENCE COUNTING Объявление свойств: @property (nonatomic, strong) MyObject *myObject;

    @property (nonatomic, weak) MyObject *myObject; Объявление полей / переменных: __strong NSString *string1; __weak NSString *string2;
  9. FACTORY Наиболее часто встречается фабричный метод. •  [NSString stringWithUTF8String: “string”];

    •  [NSNotificationCenter defaultCenter]; •  [UIApplication sharedApplication]; •  [UIColor colorWithRed: 1.f green: 1.f blue: 1.f alpha: .5f]; •  …
  10. DELEGATE Преимущества: •  Нет необходимости наследования, использование компонента AS-IS • 

    Возможность реализации одним классом функционала для ряда других классов Использование: •  Ряд стандартных UI-контролов (UITableView, UINavigationController etc) •  Удобен для использования в собственных классах и контролах •  Часто используется в реализации MVC Важно: делегат, как правило, объявляется как assign/weak, во избежание циклических ссылок и memory leak.
  11. TARGET/ACTION Преимущества: •  Нет необходимости соответствовать интерфейсу Использование: •  UIButton

    [button addTarget: self action: @selector(buttonPressed:) forControlEvents: UIControlEventTouchUpInside]; •  Другие наследники UIControl
  12. NOTIFICATION CENTER [NSNotificationCenter defaultCenter] – Singletone Основные методы: •  addObserver:selector:name:object:

    •  removeObserver:name:object: •  postNotificationName:object: Важно: observer должен быть удален из списка NSNotificationCenter до того, как сам observer будет уничтожен.
  13. NOTIFICATION CENTER Применение: •  Ряд стандартных компонентов кидает нотификации (MPMoviePlayer).

    •  Проброс сообщений между компонентами. View 1 View 2 View 3 View 4 Message
  14. NOTIFICATION CENTER Преимущества: •  Никакой связи по интерфейсу •  Отправитель

    и получатель могут абсолютно ничего не знать друг о друге •  Broadcast Недостатки: •  Неявная связь между объектами
  15. MODEL-VIEW-CONTROLLER Схема паттерна: Controller View Model Сообщения от модели данных

    Сообщения от юзера Delegate Tar/Act Notification KVO Delegate Notification
  16. INTERFACE BUILDER •  Позволяет создавать Storyboards (начиная с iOS 5.0),

    на которых видно всю схему UI приложения; •  Позволяет создавать .xib файлы с визуальным наполнением View / Controller. Как следствие, облегчает работу с UI: юзер может видеть экраны до фактической сборки приложения; •  Идет в составе XCode.
  17. UIVIEW View View A View B Свойства frame и bounds

    - CGRect: ViewA.frame: (0, 0, 360, 480) ViewA.bounds: (0, 0, 360, 480) ViewB.frame: (130, 200, 200, 250) ViewB.bounds: (0, 0, 200, 250) frame – координаты в координатной системе родителя bounds – координаты в собственной координатной системе
  18. UIVIEW Transforms view.transform = CGAffineTransformMakeRotation(angle); Важно знать: CGAffineTransformIdentity – единичная

    матрица преобразования CGAffineTransformMakeRotation(angle) – матрица для поворота CGAffineTransformMakeScale(kX, kY) – матрица для масштабирования CGAffineTransformConcat(t1, t2) – конкатенация матриц
  19. UIVIEW Иерархия UIView UIWindow View 3 View 1 View 2

    View 5 View 4 View 6 •  addSubview: •  removeFromSuperview •  insertSubview:aboveSubview: UIView владеет своими вложенными объектами
  20. UIVIEW UIView – наследник UIResponder. Наиболее интересные унаследованные методы: • 

    becomeFirstResponder •  resignFirstResponder •  isFirstResponder •  touchesBegan:withEvent: •  touchesMoved:withEvent: •  touchesEnded:withEvent: •  touchesCancelled:withEvent:
  21. UIVIEW Chain of responsibility: View3 -> View1 -> UIWindow ->

    UIApplication View 1 View 2 View 3 View 1 View 2 View 3 UIWindow
  22. UIVIEW Прочие полезные методы и свойства: •  backgroundColor •  hidden

    •  alpha •  clipsToBounds •  userInteractionEnabled •  center
  23. UIVIEWCONTROLLER Container View Controllers: Управляют другими контроллерами Составляют иерархию контроллеров

    Стандартные контейнеры: •  UINavigationController •  UISplitViewController (iPad) •  UITabBarController Content View Controllers: Управляют вложенным контентом (View) Как правило, для каждого экрана создается свой контроллер
  24. UIVIEWCONTROLLER Задачи контроллера контента: •  Управление иерархией своей View; • 

    Обработка системных сообщений, изменение View; •  Обработка сообщений от юзера, передача информации View Model; •  Обработка изменений модели данных, изменение View; Как правило, является делегатом своих View и обрабатывает сообщения от модели данных (KVO, Notifications etc.)
  25. UIVIEWCONTROLLER Ряд важных методов для работы с контентом: Работа с

    View: - viewWill/DidAppear/Disappear: - viewDidLoad/Unload Работа с ориентацией: -  shouldAutorotate (iOS 6.0 и выше) -  supportedInterfaceOrientations (iOS 6.0 и выше) -  interfaceOrientation -  shouldAutorotateToInterfaceOrientation: (до iOS 6.0)
  26. UIVIEWCONTROLLER Задача контроллера-контейнера: •  Управление иерархией контроллеров, а как следствие

    и иерархией View; Как правило владеют рядом контроллеров, при этом лишь один из них является «активным» - его иерархия View включена в общую.
  27. UIVIEWCONTROLLER window.rootViewController – начало иерархии контроллера Для любого контроллера можно

    организовать новую иерархию контроллеров: - presentModalViewController:animated: (до iOS 6.0) - dismissModalViewControllerAnimated: (до iOS 6.0) - presentViewController:animated:completion: (iOS 6.0 и выше) - dismissViewControllerAnimated:completion: (iOS 6.0 и выше)
  28. UIVIEWCONTROLLER Для управления иерархией могут пригодиться следующие методы: - addChildViewController:

    - removeFromParentViewController Для получения стандартных контейнеров, в которые вложен контроллер: - navigationController - tabBarController - splitViewController
  29. UILABEL Является наследником UIView. Цели использования: •  Отображение текста на

    экране Особенности: •  Может подстраивать размер шрифта так, чтобы текст уместился без обрезаний •  Есть возможность рассчитать размер лейбла по строке и используемому шрифту •  Может отображать несколько строк в рамках одного лейбла
  30. UILABEL Основные полезные методы и свойства: •  text/font •  adjustsFontSizeToFitWidth

    •  text/fontColor •  textAlignment •  lineBreakMode •  numberOfLines
  31. UIIMAGEVIEW Является наследником UIView. Цели использования: •  Отобразить картинку (возможно,

    с масштабированием); •  Отобразить простую короткую анимацию (потребуется набор файлов с кадрами); Особенности: •  Нужно помнить о памяти, особенно если проигрывается анимация или битмап большой.
  32. UIIMAGEVIEW Основные полезные методы и свойства: •  initWithImage: •  animationImages

    •  animationDuration •  animationRepeatCount •  startAnimating •  stopAnimating •  isAnimating
  33. UIBUTTON Является наследником UIControl. Цели использования: •  Везде, где нужна

    кнопка. Особенности: •  Метод оповещения о нажатии – Target/Action; •  Установка картинки/текста производится специальным методом. Прямая работа с соответствующей subview не работает.
  34. UIBUTTON Основные полезные методы и свойства: •  setTitle:forState: •  titleForState:

    •  setImage:forState: •  imageForState: •  setBackgroundImage:forState: •  backgroundImage:forState:
  35. UITABLEVIEW Является наследником UIScrollView. Цели использования: •  Отображение большого одномерного/двумерного

    списка однотипных (N-типных) элементов. •  Отображение одномерного/двумерного списка из нескольких элементов. Особенности использования: •  Для наполнения данными и нотификации об изменениях использует паттерн Delegate (для нотификации – delegate, для данных - dataSource). •  Имеет встроенную возможность переиспользования отображения ячеек.
  36. UITABLEVIEW Основные полезные методы и свойства: •  dequeueReusableCellWithIdentifier: •  visibleCells

    •  beginUpdates •  endUpdates •  insert/DeleteRowsAtIndexPaths:withRowAnimation: •  reloadData
  37. UITABLEVIEW Основные полезные методы и свойства dataSource(UITableViewDataSource): •  tableView:cellForRowAtIndexPath: • 

    numberOfSectionsInTableView: •  tableView:numberOfRowsInSection: Основные полезные методы и свойства delegate (UITableViewDelegate): •  tableView:heightForRowAtIndexPath: •  tableView:willDisplayCell:forRowAtIndexPath: •  tableView:didSelectRowAtIndexPath: