iOS-03-Управление памятью

55
iOS Internship 2014 Управление памятью

description

Noveo iOS school. Lecture 3.

Transcript of iOS-03-Управление памятью

Page 1: iOS-03-Управление памятью

iOS Internship 2014Управление памятью

Page 2: iOS-03-Управление памятью

Oсновы управления памятьюManual Retain-Release

Automatic Reference Counting

Лекция 2

Управление памятью

Page 3: iOS-03-Управление памятью

Управление памятью

Управление памятью

● Динамическое выделение памяти,● Использование выделенной памяти,● Высвобождение выделенной памяти.

Управление памятью

Page 4: iOS-03-Управление памятью

Управление памятью

Проблемы ручного управления памятью

● Освобождение (перезапись) данных, которые все еще используются,

● Исполнение программы без освобождения памяти, занятой долее ненужными данными.

Управление памятью

Page 5: iOS-03-Управление памятью

Управление памятью

Виды управления памятью● Ручное управление:

○ new, calloc, malloc, delete, free,○ Smart pointers (Boost / STL*),○ Manual Retain-Release (MRR).

● Автоматическое управление:○ Garbage collection (GC),○ Automatic Reference Counting (ARC)

* “Умные” указатели стали частью STL только со вступлением в силу стандарта c++11.

Управление памятью

Page 6: iOS-03-Управление памятью

Управление памятью

Эффективное управления памятью

Использование номинально необходимого объема выделяемой памяти.Достигается за счет:● Выделения памяти по необходимости,● Совместного использования данных,● Своевременного удаления долее ненужных

объектов (данных).

Управление памятью

Page 7: iOS-03-Управление памятью

Управление памятью

Диагностика управления памятью

● Clang Static Analyzer,● Developer Tools Instruments

Управление памятью

Page 8: iOS-03-Управление памятью

Управление памятью

Manual Retain-Release

Управление памятью

Page 9: iOS-03-Управление памятью

Управление памятью

Основные правила управления памятью

К управлению памятью следует подходить с позиций “владения” и “объектных графов”.

* Объектный граф - группа объектов, которые соединены в сеть по средствам установления тех или иных отношений между ними.

Управление памятью

Page 10: iOS-03-Управление памятью

Управление памятью

Основные правила управления памятью

Вы владеете любым объектом, который создаете.

Для создания объекта используются методы, начинающиеся с “alloc”, “new”, “copy”, “mutableCopy”.

Управление памятью

Page 11: iOS-03-Управление памятью

Управление памятью

Основные правила управления памятью

Вы можете завладеть объектом по средствам отправки сообщения retain.

1. Сохранить переданный объект в качестве значения некоторого свойства,

2. Предохранить объект от преждевременного уничтожения.

Управление памятью

Page 12: iOS-03-Управление памятью

Управление памятью

Основные правила управления памятью

Вы должны отказаться от права владения объектом тогда, когда он долее не нужен.

Для отказа достаточно послать объекту одно из сообщений release или autorelease.

Управление памятью

Page 13: iOS-03-Управление памятью

Управление памятью

Пример{

Pupil *aPupil = [[Pupil alloc] init];// ...NSString *name = aPupil.name;// ...[aPupil release];aPupil = nil;

}

Управление памятью

Page 14: iOS-03-Управление памятью

Управление памятью

Пример- (NSString *)fullName{

NSString *fullName =[[[NSString alloc] initWithFormat:@”%@ %@”,

self.surname, self.name] autorelease];

return fullName;}

Управление памятью

Page 15: iOS-03-Управление памятью

Управление памятью

Пример- (NSString *)fullName{

NSString *fullName =[NSString stringWithFormat:@”%@ %@”,

self.surname, self.name];

return fullName;}

Управление памятью

Page 16: iOS-03-Управление памятью

Управление памятью

Основные правила управления памятью

Вы не владеете объектами, которые вам вернули по ссылке.

Управление памятью

Page 17: iOS-03-Управление памятью

Управление памятью

Основные правила управления памятью

Ни при каких условиях вы не должны отказываться от прав на владение тем или иным объектом, если вы им не владеете.

Управление памятью

Page 18: iOS-03-Управление памятью

Управление памятью

Пример{

NSError *error = nil;NSString *string =

[[NSString alloc]initWithContentsOfFile:<#file name#>encoding:NSUTF8StringEncodingerror:&error];

if (string == nil) {// Handle the error ...

}// ...[string release];string = nil;

}

Управление памятью

Page 19: iOS-03-Управление памятью

Управление памятью

● Осуществляется автоматически как только счетчик ссылок достигает значения 0,

● Всегда сопряжено с вызовом метода dealloc (определен в классе NSObject) у того объекта, который будет удален из памяти.

Высвобождение памяти

Управление памятью

Page 20: iOS-03-Управление памятью

Управление памятью

Высвобождение памяти

Метод dealloc всегда вызывается автоматически, не пытайтесь вызывать его

самостоятельно.

Управление памятью

Page 21: iOS-03-Управление памятью

Управление памятью

1. Высвобождение занятой объектом памяти,2. Освобождение занятых ресурсов,3. Отказ от прав на владение любыми

внутренними объектами.

Роль метода dealloc

Управление памятью

Page 22: iOS-03-Управление памятью

Управление памятью

Пример@interface Pupil : NSObject@property (retain) NSString *name;@end

@implementation Pupil//...- (void)dealloc{

[name release];name = nil;[super dealloc];

}@end

Управление памятью

Page 23: iOS-03-Управление памятью

Управление памятью

1. Вы обязаны вызвать [super dealloc],2. Ни при каких обстоятельствах не помещайте

код, управляющий системными ресурсами, в переопределенную реализацию метода.

Переопределение метода dealloc

Управление памятью

Page 24: iOS-03-Управление памятью

Управление памятью

К свойствам объектов применимы следующие классификаторы:● retain● copy,● readonly,● readwrite (default for scalars),● assign (default for objects).

Классификаторы времени жизни

Управление памятью

Page 25: iOS-03-Управление памятью

Управление памятью

● Решает проблему циклических ссылок,● Не оказывает влияния на счетчик ссылок,● Классификатор assign.

“Слабое” связывание объектов

Управление памятью

Page 26: iOS-03-Управление памятью

Управление памятью

Пример@interface UITableView : UIScrollView <NSCoding>//...@property (nonatomic, assign)

id<UITableViewDataSource> dataSource;@property (nonatomic, assign)

id<UITableViewDelegate> delegate;//...

Управление памятью

Page 27: iOS-03-Управление памятью

Управление памятью

Autorelease Pools

Управление памятью

Page 28: iOS-03-Управление памятью

Управление памятью

Механизм, предоставляющий возможность отказаться от прав владения объектом, избегая немедленного высвобождения памяти.Все объекты, получившие сообщение autorelease, остаются в памяти до тех пор, пока жив pool, в котором объект получил это сообщение.

Autorelease pools

Управление памятью

Page 29: iOS-03-Управление памятью

Управление памятью

Обычно вам не нужно создавать подобного рода объекты, за исключением нескольких

особых случаев.

Autorelease pools

Управление памятью

Page 30: iOS-03-Управление памятью

Управление памятью

Вы работаете над приложением, котороене базируется на UI framework.

Особые случаи

Управление памятью

Page 31: iOS-03-Управление памятью

Управление памятью

Вы работаете над неким циклом, который порождает множество временных объектов.

Особые случаи

Управление памятью

Page 32: iOS-03-Управление памятью

Управление памятью

Вы работаете над многопоточным приложением. Каждый новый поток должен

иметь собственный autorelease pool к моменту запуска.

Особые случаи

Управление памятью

Page 33: iOS-03-Управление памятью

Управление памятью

При уничтожении autorelease pool рассылает сообщение release всем связанным с ним объектам, которые до момента уничтожения получили сообщение autorelease.Число рассылаемых сообщений release равно числу разосланных autorelease.

Принцип действия

Управление памятью

Page 34: iOS-03-Управление памятью

Управление памятью

Пример{// ...

NSAutoreleasePool *const pool =[[NSAutoreleasePool alloc] init];

// Code that creates autoreleased objects.

[pool release];// ...}

Управление памятью

Page 37: iOS-03-Управление памятью

Управление памятью

Automatic Reference Counting

Управление памятью

Page 38: iOS-03-Управление памятью

Управление памятью

● Концептуально ARC идентичен MRR,● В отличии от MRR, подсчет ссылок

осуществляется автоматически,● Все необходимые для управления памятью

вызовы расставляются за вас на этапе компиляции.

Переход на ARC

Управление памятью

Page 39: iOS-03-Управление памятью

Управление памятью

● Лишен недостатков, присущих ручным способам управления памятью,

● Уменьшает объем кода,● Уменьшает время разработки,● Нарушение установленных правил

управления памятью приводит к ошибке компиляции.

Преимущества ARC

Управление памятью

Page 40: iOS-03-Управление памятью

Управление памятью

“You are strongly encouraged to use ARC for new projects.”

Copyright © 2012 Apple Inc. All Rights Reserved.

Когда использовать ARC?

Управление памятью

Page 41: iOS-03-Управление памятью

Управление памятью

Запрещено вызывать:● retain,● release (autorelease),● [super dealloc].

Ограничения накладываемые ARC

Управление памятью

Page 42: iOS-03-Управление памятью

Управление памятью

Множество классификаторов, применимых к свойствам объектов, дополнено:● strong (default for objects),● weak,● unsafe_unretained.

Классификаторы времени жизни

Управление памятью

Page 43: iOS-03-Управление памятью

Управление памятью

К переменным применимы следующие классификаторы:● __strong (default for objects),● __weak,● __unsafe_unretained,● __autoreleasing.

Классификаторы времени жизни

Управление памятью

Page 44: iOS-03-Управление памятью

Управление памятью

Оформляйте классификаторы правильно!

ClassName *qualifier variable;

Классификаторы времени жизни

Управление памятью

Page 45: iOS-03-Управление памятью

Управление памятью

Пример// ...

MyClass *__weak weakReference = ...;

MyClass *__unsafe_unretained unsafeReference = ...;

// ...

Управление памятью

Page 46: iOS-03-Управление памятью

Управление памятью

Пример{// ...

NSString *__weak string =[[NSString alloc] initWithFormat:

@"First Name: %@", [self firstName]];NSLog(@"string: %@", string);

// ...}

Управление памятью

Page 47: iOS-03-Управление памятью

Управление памятью

Пример{// ...

NSError *error;BOOL OK = [object doSomethingWithError:&error];if (!OK) {

// ...}

Управление памятью

Page 48: iOS-03-Управление памятью

Управление памятью

Пример{// ...

NSError *__strong error;NSError *__autoreleasing tmp = error;BOOL OK = [object doSomethingWithError:&tmp];error = tmp;if (!OK) {

// ...}

Управление памятью

Page 49: iOS-03-Управление памятью

Управление памятью

Пример{// ...

NSError *__autoreleasing error;BOOL OK = [object doSomethingWithError:&error];if (!OK) {

// ...}

Управление памятью

Page 50: iOS-03-Управление памятью

Управление памятью

При помощи флагов компилятора:● -fobjc-arc,● -fno-objc-arc (для отдельных файлов).

Включение/выключение ARC

Управление памятью

Page 51: iOS-03-Управление памятью

Управление памятью

Autorelease PoolBlocks

Управление памятью

Page 52: iOS-03-Управление памятью

Управление памятью

● Концептуально блоки ничем не отличаются от объектов,

● Отличие состоит только в синтаксической записи.

Autorelease Pool Blocks

Управление памятью

Page 53: iOS-03-Управление памятью

Управление памятью

Пример{// ...

@autoreleasepool {

// Code that creates autoreleased objects.

}// ...}

Управление памятью