3. Управление памятью
Управление памятью
● Динамическое выделение памяти,
● Использование выделенной памяти,
● Высвобождение выделенной памяти.
Управление памятью
4. Управление памятью
Проблемы ручного управления памятью
● Освобождение (перезапись) данных,
которые все еще используются,
● Исполнение программы без освобождения
памяти, занятой долее ненужными данными.
Управление памятью
5. Управление памятью
Виды управления памятью
● Ручное управление:
○ new, calloc, malloc, delete, free,
○ Smart pointers (Boost / STL*),
○ Manual Retain-Release (MRR).
● Автоматическое управление:
○ Garbage collection (GC),
○ Automatic Reference Counting (ARC)
* “Умные” указатели стали частью STL только со вступлением в силу
стандарта c++11.
Управление памятью
6. Управление памятью
Эффективное управления памятью
Использование номинально необходимого объема
выделяемой памяти.
Достигается за счет:
● Выделения памяти по необходимости,
● Совместного использования данных,
● Своевременного удаления долее ненужных
объектов (данных).
Управление памятью
9. Управление памятью
Основные правила управления памятью
К управлению памятью следует подходить с
позиций “владения” и “объектных графов”.
* Объектный граф - группа объектов, которые
соединены в сеть по средствам установления тех
или иных отношений между ними.
Управление памятью
10. Управление памятью
Основные правила управления памятью
Вы владеете любым объектом, который
создаете.
Для создания объекта используются методы,
начинающиеся с “alloc”, “new”, “copy”,
“mutableCopy”.
Управление памятью
11. Управление памятью
Основные правила управления памятью
Вы можете завладеть объектом по средствам
отправки сообщения retain.
1. Сохранить переданный объект в качестве
значения некоторого свойства,
2. Предохранить объект от преждевременного
уничтожения.
Управление памятью
12. Управление памятью
Основные правила управления памятью
Вы должны отказаться от права владения
объектом тогда, когда он долее не нужен.
Для отказа достаточно послать объекту одно из
сообщений release или autorelease.
Управление памятью
17. Управление памятью
Основные правила управления памятью
Ни при каких условиях вы не должны
отказываться от прав на владение тем или
иным объектом, если вы им не владеете.
Управление памятью
18. Управление памятью
Пример
{
NSError *error = nil;
NSString *string =
[[NSString alloc]
initWithContentsOfFile:<#file name#>
encoding:NSUTF8StringEncoding
error:&error];
if (string == nil) {
// Handle the error ...
}
// ...
[string release];
string = nil;
}
Управление памятью
19. Управление памятью
● Осуществляется автоматически как только
счетчик ссылок достигает значения 0,
● Всегда сопряжено с вызовом метода dealloc
(определен в классе NSObject) у того
объекта, который будет удален из памяти.
Высвобождение памяти
Управление памятью
21. Управление памятью
1. Высвобождение занятой объектом памяти,
2. Освобождение занятых ресурсов,
3. Отказ от прав на владение любыми
внутренними объектами.
Роль метода dealloc
Управление памятью
22. Управление памятью
Пример
@interface Pupil : NSObject
@property (retain) NSString *name;
@end
@implementation Pupil
//...
- (void)dealloc
{
[name release];
name = nil;
[super dealloc];
}
@end
Управление памятью
23. Управление памятью
1. Вы обязаны вызвать [super dealloc],
2. Ни при каких обстоятельствах не помещайте
код, управляющий системными ресурсами, в
переопределенную реализацию метода.
Переопределение метода dealloc
Управление памятью
24. Управление памятью
К свойствам объектов применимы следующие
классификаторы:
● retain
● copy,
● readonly,
● readwrite (default for scalars),
● assign (default for objects).
Классификаторы времени жизни
Управление памятью
25. Управление памятью
● Решает проблему циклических ссылок,
● Не оказывает влияния на счетчик ссылок,
● Классификатор assign.
“Слабое” связывание объектов
Управление памятью
26. Управление памятью
Пример
@interface UITableView : UIScrollView <NSCoding>
//...
@property (nonatomic, assign)
id<UITableViewDataSource> dataSource;
@property (nonatomic, assign)
id<UITableViewDelegate> delegate;
//...
Управление памятью
28. Управление памятью
Механизм, предоставляющий возможность отказаться
от прав владения объектом, избегая немедленного
высвобождения памяти.
Все объекты, получившие сообщение autorelease,
остаются в памяти до тех пор, пока жив pool, в котором
объект получил это сообщение.
Autorelease pools
Управление памятью
29. Управление памятью
Обычно вам не нужно создавать подобного
рода объекты, за исключением нескольких
особых случаев.
Autorelease pools
Управление памятью
31. Управление памятью
Вы работаете над неким циклом, который
порождает множество временных объектов.
Особые случаи
Управление памятью
32. Управление памятью
Вы работаете над многопоточным
приложением. Каждый новый поток должен
иметь собственный autorelease pool к моменту
запуска.
Особые случаи
Управление памятью
33. Управление памятью
При уничтожении autorelease pool рассылает
сообщение release всем связанным с ним
объектам, которые до момента уничтожения
получили сообщение autorelease.
Число рассылаемых сообщений release равно
числу разосланных autorelease.
Принцип действия
Управление памятью
38. Управление памятью
● Концептуально ARC идентичен MRR,
● В отличии от MRR, подсчет ссылок
осуществляется автоматически,
● Все необходимые для управления памятью
вызовы расставляются за вас на этапе
компиляции.
Переход на ARC
Управление памятью
39. Управление памятью
● Лишен недостатков, присущих ручным
способам управления памятью,
● Уменьшает объем кода,
● Уменьшает время разработки,
● Нарушение установленных правил
управления памятью приводит к ошибке
компиляции.
Преимущества ARC
Управление памятью
42. Управление памятью
Множество классификаторов, применимых к
свойствам объектов, дополнено:
● strong (default for objects),
● weak,
● unsafe_unretained.
Классификаторы времени жизни
Управление памятью
43. Управление памятью
К переменным применимы следующие
классификаторы:
● __strong (default for objects),
● __weak,
● __unsafe_unretained,
● __autoreleasing.
Классификаторы времени жизни
Управление памятью
50. Управление памятью
При помощи флагов компилятора:
● -fobjc-arc,
● -fno-objc-arc (для отдельных файлов).
Включение/выключение ARC
Управление памятью
52. Управление памятью
● Концептуально блоки ничем не отличаются
от объектов,
● Отличие состоит только в синтаксической
записи.
Autorelease Pool Blocks
Управление памятью
55. Управление памятью
● Transitioning to ARC Release Notes
● Toll-Free Bridged Types
● Советы по переходу на ARC
Справочная литература
Управление памятью