iOS-03-Управление памятью
description
Transcript of iOS-03-Управление памятью
iOS Internship 2014Управление памятью
Oсновы управления памятьюManual Retain-Release
Automatic Reference Counting
Лекция 2
Управление памятью
Управление памятью
Управление памятью
● Динамическое выделение памяти,● Использование выделенной памяти,● Высвобождение выделенной памяти.
Управление памятью
Управление памятью
Проблемы ручного управления памятью
● Освобождение (перезапись) данных, которые все еще используются,
● Исполнение программы без освобождения памяти, занятой долее ненужными данными.
Управление памятью
Управление памятью
Виды управления памятью● Ручное управление:
○ new, calloc, malloc, delete, free,○ Smart pointers (Boost / STL*),○ Manual Retain-Release (MRR).
● Автоматическое управление:○ Garbage collection (GC),○ Automatic Reference Counting (ARC)
* “Умные” указатели стали частью STL только со вступлением в силу стандарта c++11.
Управление памятью
Управление памятью
Эффективное управления памятью
Использование номинально необходимого объема выделяемой памяти.Достигается за счет:● Выделения памяти по необходимости,● Совместного использования данных,● Своевременного удаления долее ненужных
объектов (данных).
Управление памятью
Управление памятью
Диагностика управления памятью
● Clang Static Analyzer,● Developer Tools Instruments
Управление памятью
Управление памятью
Manual Retain-Release
Управление памятью
Управление памятью
Основные правила управления памятью
К управлению памятью следует подходить с позиций “владения” и “объектных графов”.
* Объектный граф - группа объектов, которые соединены в сеть по средствам установления тех или иных отношений между ними.
Управление памятью
Управление памятью
Основные правила управления памятью
Вы владеете любым объектом, который создаете.
Для создания объекта используются методы, начинающиеся с “alloc”, “new”, “copy”, “mutableCopy”.
Управление памятью
Управление памятью
Основные правила управления памятью
Вы можете завладеть объектом по средствам отправки сообщения retain.
1. Сохранить переданный объект в качестве значения некоторого свойства,
2. Предохранить объект от преждевременного уничтожения.
Управление памятью
Управление памятью
Основные правила управления памятью
Вы должны отказаться от права владения объектом тогда, когда он долее не нужен.
Для отказа достаточно послать объекту одно из сообщений release или autorelease.
Управление памятью
Управление памятью
Пример{
Pupil *aPupil = [[Pupil alloc] init];// ...NSString *name = aPupil.name;// ...[aPupil release];aPupil = nil;
}
Управление памятью
Управление памятью
Пример- (NSString *)fullName{
NSString *fullName =[[[NSString alloc] initWithFormat:@”%@ %@”,
self.surname, self.name] autorelease];
return fullName;}
Управление памятью
Управление памятью
Пример- (NSString *)fullName{
NSString *fullName =[NSString stringWithFormat:@”%@ %@”,
self.surname, self.name];
return fullName;}
Управление памятью
Управление памятью
Основные правила управления памятью
Вы не владеете объектами, которые вам вернули по ссылке.
Управление памятью
Управление памятью
Основные правила управления памятью
Ни при каких условиях вы не должны отказываться от прав на владение тем или иным объектом, если вы им не владеете.
Управление памятью
Управление памятью
Пример{
NSError *error = nil;NSString *string =
[[NSString alloc]initWithContentsOfFile:<#file name#>encoding:NSUTF8StringEncodingerror:&error];
if (string == nil) {// Handle the error ...
}// ...[string release];string = nil;
}
Управление памятью
Управление памятью
● Осуществляется автоматически как только счетчик ссылок достигает значения 0,
● Всегда сопряжено с вызовом метода dealloc (определен в классе NSObject) у того объекта, который будет удален из памяти.
Высвобождение памяти
Управление памятью
Управление памятью
Высвобождение памяти
Метод dealloc всегда вызывается автоматически, не пытайтесь вызывать его
самостоятельно.
Управление памятью
Управление памятью
1. Высвобождение занятой объектом памяти,2. Освобождение занятых ресурсов,3. Отказ от прав на владение любыми
внутренними объектами.
Роль метода dealloc
Управление памятью
Управление памятью
Пример@interface Pupil : NSObject@property (retain) NSString *name;@end
@implementation Pupil//...- (void)dealloc{
[name release];name = nil;[super dealloc];
}@end
Управление памятью
Управление памятью
1. Вы обязаны вызвать [super dealloc],2. Ни при каких обстоятельствах не помещайте
код, управляющий системными ресурсами, в переопределенную реализацию метода.
Переопределение метода dealloc
Управление памятью
Управление памятью
К свойствам объектов применимы следующие классификаторы:● retain● copy,● readonly,● readwrite (default for scalars),● assign (default for objects).
Классификаторы времени жизни
Управление памятью
Управление памятью
● Решает проблему циклических ссылок,● Не оказывает влияния на счетчик ссылок,● Классификатор assign.
“Слабое” связывание объектов
Управление памятью
Управление памятью
Пример@interface UITableView : UIScrollView <NSCoding>//...@property (nonatomic, assign)
id<UITableViewDataSource> dataSource;@property (nonatomic, assign)
id<UITableViewDelegate> delegate;//...
Управление памятью
Управление памятью
Autorelease Pools
Управление памятью
Управление памятью
Механизм, предоставляющий возможность отказаться от прав владения объектом, избегая немедленного высвобождения памяти.Все объекты, получившие сообщение autorelease, остаются в памяти до тех пор, пока жив pool, в котором объект получил это сообщение.
Autorelease pools
Управление памятью
Управление памятью
Обычно вам не нужно создавать подобного рода объекты, за исключением нескольких
особых случаев.
Autorelease pools
Управление памятью
Управление памятью
Вы работаете над приложением, котороене базируется на UI framework.
Особые случаи
Управление памятью
Управление памятью
Вы работаете над неким циклом, который порождает множество временных объектов.
Особые случаи
Управление памятью
Управление памятью
Вы работаете над многопоточным приложением. Каждый новый поток должен
иметь собственный autorelease pool к моменту запуска.
Особые случаи
Управление памятью
Управление памятью
При уничтожении autorelease pool рассылает сообщение release всем связанным с ним объектам, которые до момента уничтожения получили сообщение autorelease.Число рассылаемых сообщений release равно числу разосланных autorelease.
Принцип действия
Управление памятью
Управление памятью
Пример{// ...
NSAutoreleasePool *const pool =[[NSAutoreleasePool alloc] init];
// Code that creates autoreleased objects.
[pool release];// ...}
Управление памятью
Управление памятью
Управления памятью в Core Foundation
Темы для самостоятельного изучения
Управление памятью
Управление памятью
● Memory Management Policy,● Practical Memory Management,● Memory Management Programming Guide for Core
Foundation.
Справочная литература
Управление памятью
Управление памятью
Automatic Reference Counting
Управление памятью
Управление памятью
● Концептуально ARC идентичен MRR,● В отличии от MRR, подсчет ссылок
осуществляется автоматически,● Все необходимые для управления памятью
вызовы расставляются за вас на этапе компиляции.
Переход на ARC
Управление памятью
Управление памятью
● Лишен недостатков, присущих ручным способам управления памятью,
● Уменьшает объем кода,● Уменьшает время разработки,● Нарушение установленных правил
управления памятью приводит к ошибке компиляции.
Преимущества ARC
Управление памятью
Управление памятью
“You are strongly encouraged to use ARC for new projects.”
Copyright © 2012 Apple Inc. All Rights Reserved.
Когда использовать ARC?
Управление памятью
Управление памятью
Запрещено вызывать:● retain,● release (autorelease),● [super dealloc].
Ограничения накладываемые ARC
Управление памятью
Управление памятью
Множество классификаторов, применимых к свойствам объектов, дополнено:● strong (default for objects),● weak,● unsafe_unretained.
Классификаторы времени жизни
Управление памятью
Управление памятью
К переменным применимы следующие классификаторы:● __strong (default for objects),● __weak,● __unsafe_unretained,● __autoreleasing.
Классификаторы времени жизни
Управление памятью
Управление памятью
Оформляйте классификаторы правильно!
ClassName *qualifier variable;
Классификаторы времени жизни
Управление памятью
Управление памятью
Пример// ...
MyClass *__weak weakReference = ...;
MyClass *__unsafe_unretained unsafeReference = ...;
// ...
Управление памятью
Управление памятью
Пример{// ...
NSString *__weak string =[[NSString alloc] initWithFormat:
@"First Name: %@", [self firstName]];NSLog(@"string: %@", string);
// ...}
Управление памятью
Управление памятью
Пример{// ...
NSError *error;BOOL OK = [object doSomethingWithError:&error];if (!OK) {
// ...}
Управление памятью
Управление памятью
Пример{// ...
NSError *__strong error;NSError *__autoreleasing tmp = error;BOOL OK = [object doSomethingWithError:&tmp];error = tmp;if (!OK) {
// ...}
Управление памятью
Управление памятью
Пример{// ...
NSError *__autoreleasing error;BOOL OK = [object doSomethingWithError:&error];if (!OK) {
// ...}
Управление памятью
Управление памятью
При помощи флагов компилятора:● -fobjc-arc,● -fno-objc-arc (для отдельных файлов).
Включение/выключение ARC
Управление памятью
Управление памятью
Autorelease PoolBlocks
Управление памятью
Управление памятью
● Концептуально блоки ничем не отличаются от объектов,
● Отличие состоит только в синтаксической записи.
Autorelease Pool Blocks
Управление памятью
Управление памятью
Пример{// ...
@autoreleasepool {
// Code that creates autoreleased objects.
}// ...}
Управление памятью
Управление памятью
Особенности управления памятью в Core Foundation с использованием ARC.
Темы для самостоятельного изучения
Управление памятью
Управление памятью
● Transitioning to ARC Release Notes● Toll-Free Bridged Types
● Советы по переходу на ARC
Справочная литература
Управление памятью