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

Post on 21-Dec-2014

182 Views

Category:

Software

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Noveo iOS school. Lecture 3.

TRANSCRIPT

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];// ...}

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

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

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.

}// ...}

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

top related