3. Разработка под iOS
• Инструменты
• Основные типы данных
• Управление памятью
• UIKit (UIView + UIViewController + UI..)
∞
• Жизненный цикл приложения
• Фундаментальные шаблоны в iOS
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( ... )
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. Методы или
селекторы?
Если нету никакого контекста, то можно
для простоты считать, что
Метод == Селектор
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
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 ?
71. Automacic Reference
Counting
• Позволяет избавиться от лишнего кода
• Меньше кода - больше разработки ;)
• Избавляет от головной боли
• Добавляет зубную боль ;)
http://longweekendmobile.com/2011/09/07/objc-
automatic-reference-counting-in-xcode-explained/
77. UIView
• Все, что отображено на экране
наследуется от UIView
• Каждый view может быть контейнером
для других view
• addSubview:
• removeFromSuperview
84. UIViewController
Основные задачи
• Загрузка (и выгрузка) вьюх
• Связь вьюх и модели
• Управление UI приложения
• Реагирование на изменение
ориентации экрана
• Реагирование на memory warnings