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

4,181 views

Published on

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,181
On SlideShare
0
From Embeds
0
Number of Embeds
255
Actions
Shares
0
Downloads
0
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

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

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

×