SlideShare a Scribd company logo
1 of 28
Управление
 памятью в iOS -
Лучшие Практики
Почему об этом столько говорят?
• Не полностью автоматоматическое
• Не полностью ручное

• Нет Garbage Collector под iOS




                                     2
Подсчёт ссылок
• Alloc (+1)      1
• Retain (+1)     2
• Release (-1)   1
• Release (-1)    0
• Release      ПАДЕНИЕ!
Владение объектом
• Кто сделал init, тот и папа
  SomeObject *iOwnThis = [[SomeObject alloc] init];
[iOwnThis doYourThing];
   [iOwnThis release];

• Временный объект
 NSNumber* value = [NSNumber numberWithFloat:14.78];

Передача владения
  - (void) setName: (NSString*)str {
     [name release];
     name = [str retain];
 }
Договорённость по именованию
• Чтобы создать объект и стать его владельцем
  надо использовать один из следующих методов
 –alloc
 –new
 –copy
 –mutableCopy




                                                5
dealloc
• Отвечает за освобождение памяти
• Внутри нужно вызвать [super dealloc]
• Не рекомндуется вкладывать другую
  функциональность
• Можно сделать [obj release] если obj равен nil
• Этот метод нигде кроме [super dealloc] не
  должен вызываться вручную



                                                   6
Property в Objective C
• Writability
  –readonly
  –readwrite
• Setter semantic
  –assign
  –copy
  –retain
• Atomicity
  –atomic
  –nonatomic

                                       7
Property
• Обьявление

 @property (writability, setter, atomicity) type *name;
 @synthesize name = _name;


• Использование

 object.propertyName = newValue;
 value = object.propertyName;




                                                          8
Assign property
- (void)setSomeValue:(SomeVariable*)aSomeVariableValue
{
    someValue = aSomeVariableValue;
}




                                                         9
Retain property
- (void)setSomeInstance:(SomeClass *)aSomeInstanceValue
{
    if (someInstance == aSomeInstanceValue)
      return;


    SomeClass *oldValue = someInstance;
    someInstance = [aSomeInstanceValue retain];
    [oldValue release];
}




                                                          10
Copy property
- (void)setStringValue:(NSString *)aString
{
    if (stringValue == aString)
      return;


    NSString *oldValue = stringValue;
    stringValue = [aString copy];
    [oldValue release];
}




                                             11
NSAutoreleasePool
• В него добавляются временные
  объекты
• Автоматически создаётся в
  главном потоке

• *** __NSAutoreleaseNoPool(): Object autoreleased
  with no pool in place — just leaking
• В других потоках надо создавать отдельно
AutoreleasePool в главном потоке
int main(int argc, char *argv[]) {


    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}



int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, nil);
    }
}
                                                                   13
Распространённые ошибки
- (void) reset
{
    NSNumber * zero = [[NSNumber alloc] initWithInteger:0];
    [self setCount:zero];
}


Исправленная версия
- (void) reset
{
   NSNumber * zero = [[NSNumber alloc] initWithInteger:0];
   [self setCount:zero];
   [zero release];
}

                                                              14
Распространённые ошибки
• - (void) reset
• {
•     NSNumber * zero = [NSNumber numberWithInteger:0];
•     [self setCount:zero];
•     [zero release];
• }


• Исправленная версия
•
    - (void) reset
•   {
•      NSNumber * zero = [NSNumber numberWithInteger:0];
•      [self setCount:zero];
•   }

                                                           15
Возвращение Property
• - (NSNumber*) count
• {
•     [count retain];
•     return count;
• }

• Исправленная версия
• - (NSNumber*) count
• {
•    return count;
• }




                                        16
Обращение к Property
• - (void) reset
• {
•     NSNumber * zero = [NSNumber numberWithInteger:0];
•
•     self.count = zero;
• //Разные вещи!!!
•     count = zero;
• }




                                                          17
Добавление в массив передаёт
                    владение объектом
• - (NSArray *)getPeople {
•     NSMutableArray *array = [[NSMutableArray alloc] init];
•     for (int i = 0; i < 10; i++) {
•         Person *p = [[Person alloc] init];
•         [array addObject:p];
•     }
•     return array;
• }

• Исправленная версия
• - (NSArray *)getPeople {
•     NSMutableArray *array = [[NSMutableArray alloc] init];
•     for (int i = 0; i < 10; i++) {
•         Person *p = [[Person alloc] init];
•         [array addObject:p];
•         [p release];                                         18
Перезапись без release
- (void) leak
{
    name = [[NSString alloc] initWithFormat:@"%@-%@",@"John",@"Paul"];
    name = @"Chris";
}




Исправленная версия
- (void) leak
{
    name = [[NSString alloc] initWithFormat:@"%@-%@",@"John",@"Paul"];
    [name release];
    name = @"Chris";
}

                                                                         19
Повисший указатель
- (id) init{


    if (self = [super init]) {
        count = [NSNumber numberWithInteger:0];
    }


    return self;
}


- (void) logCount
{
    NSLog(@"Count is %@",count);
}
                                                  20
Исправленная версия
- (id) init{

    if (self = [super init]) {
        count = [NSNumber numberWithInteger:0];
        [count retain];
    }
    return self;
}

- (void) logCount
{
   NSLog(@"Count is %@",count);
}

- (void) dealloc
{
   [count release];
}


                                                  21
Обнуление делегатов
- (void)dealloc
{
    self.someObject.delegate = nil;
    self.someObject = nil;


    [super dealloc];
}




                                        22
Memory Warning

• Автоматически делается
  setView:nil неактивным ViewControllers
• Чистим ресурсы в приложении
    - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
    [[ImageCache sharedImageCache] removeAllImagesInMemory];
}


• Подписываемся на Notification
    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
    [center addObserver:self
          selector:@selector(whatever:)
             name:UIApplicationDidReceiveMemoryWarningNotification
            object:nil];
                                                                              23
Устранение ошибок памяти
• Используйте LLVM / Clang статический
  анализатор
• Не overthink управления памятью
• Всегда используйте методы доступа; объявить
  доступа с использованием свойств
• Инструмент Инструменты Утечки
EXC_BAD_ACCESS
• Поставтье брейкпойнт в программе и шагайте до
  падения
• Тактика закомменть и попробуй падает ли
• NSZombieEnabled - при падении можно увидеть к
  объекту какого типа было обращение и какой
  селектор был вызван
Clang Static Analyzer




                        26
Автоматический подсчёт ссылок
• По сути - автоматическое исправление всех
  замечаний найденных статическим
  анализатором
• Не сборка мусора!
• Не может решить всех проблем связанных с
  циклическими ссылками




                                              27
Property в ARC
• strong - аналог retain. Проперти является
  владельцем объекта по ссылке
• weak - слабая ссылка без владения.
  Автоматически ставиться в nil когда объект по
  ссылке удаляется.
• unsafe_unretained - синоним assign. Надо
  использовать вместо weak в iOS 4
• copy - всё попрежнему, объект копируется и
  создаётся сильная связь
                                                  28

More Related Content

What's hot

Yii development
Yii developmentYii development
Yii development
MageCloud
 
Java tricks for high-load server programming
Java tricks for high-load server programmingJava tricks for high-load server programming
Java tricks for high-load server programming
Andrei Pangin
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел Тайкало
Stanfy
 

What's hot (20)

Yii development
Yii developmentYii development
Yii development
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Объектное и прототипное программирование в Javascript
Объектное и прототипное программирование в JavascriptОбъектное и прототипное программирование в Javascript
Объектное и прототипное программирование в Javascript
 
Java tricks for high-load server programming
Java tricks for high-load server programmingJava tricks for high-load server programming
Java tricks for high-load server programming
 
Правильная организация клиент-карточного взаимодействия — Антон Корзунов
Правильная организация клиент-карточного взаимодействия — Антон КорзуновПравильная организация клиент-карточного взаимодействия — Антон Корзунов
Правильная организация клиент-карточного взаимодействия — Антон Корзунов
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибок
 
Kvc, kvo
Kvc, kvoKvc, kvo
Kvc, kvo
 
Decorators' recipes
Decorators' recipesDecorators' recipes
Decorators' recipes
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка Django
 
Асинхронный JavaScript
Асинхронный JavaScriptАсинхронный JavaScript
Асинхронный JavaScript
 
Что API Карт забыл на сервере — Антон Корзунов
Что API Карт забыл на сервере — Антон КорзуновЧто API Карт забыл на сервере — Антон Корзунов
Что API Карт забыл на сервере — Антон Корзунов
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел Тайкало
 
msumobi2. Лекция 2
msumobi2. Лекция 2msumobi2. Лекция 2
msumobi2. Лекция 2
 
Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with Java
 
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
 
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2
 
Очень вкусный фрукт Guava
Очень вкусный фрукт GuavaОчень вкусный фрукт Guava
Очень вкусный фрукт Guava
 

Viewers also liked

Доклад Сергея Митрофанова на Harvest в Казани
Доклад Сергея Митрофанова на Harvest в КазаниДоклад Сергея Митрофанова на Harvest в Казани
Доклад Сергея Митрофанова на Harvest в Казани
it-park
 
Gruzobzor.ru
Gruzobzor.ruGruzobzor.ru
Gruzobzor.ru
it-park
 
Eco vision
Eco visionEco vision
Eco vision
it-park
 
0302 2 perú 2021 premió a 12 empresas por sus responsabilidad social-perú exp...
0302 2 perú 2021 premió a 12 empresas por sus responsabilidad social-perú exp...0302 2 perú 2021 premió a 12 empresas por sus responsabilidad social-perú exp...
0302 2 perú 2021 premió a 12 empresas por sus responsabilidad social-perú exp...
Perú 2021
 
(Sector) recortes de prensa 29 07-2013
(Sector) recortes de prensa 29 07-2013(Sector) recortes de prensa 29 07-2013
(Sector) recortes de prensa 29 07-2013
Sff-cgt Cgt Málaga
 
Fanzine virtual karina e luana
Fanzine virtual karina e luanaFanzine virtual karina e luana
Fanzine virtual karina e luana
FABIANA
 
Folleto ferrocarril que defiende CGT 2012
Folleto ferrocarril que defiende CGT 2012Folleto ferrocarril que defiende CGT 2012
Folleto ferrocarril que defiende CGT 2012
Sff-cgt Cgt Málaga
 
0302 1 perú 2021 premió a 12 empresas por sus responsabilidad social-perú ex...
0302 1  perú 2021 premió a 12 empresas por sus responsabilidad social-perú ex...0302 1  perú 2021 premió a 12 empresas por sus responsabilidad social-perú ex...
0302 1 perú 2021 premió a 12 empresas por sus responsabilidad social-perú ex...
Perú 2021
 
CV - Rolando Barragan 2016F
CV - Rolando Barragan 2016FCV - Rolando Barragan 2016F
CV - Rolando Barragan 2016F
Rolando Barragan
 
T&k test analyzers cn
T&k test analyzers cnT&k test analyzers cn
T&k test analyzers cn
Brian Bateman
 
El arbol mágico modificado.... daniel villanueva
El arbol  mágico modificado.... daniel villanuevaEl arbol  mágico modificado.... daniel villanueva
El arbol mágico modificado.... daniel villanueva
lafantasia
 
Megan Carroll Resume
Megan Carroll ResumeMegan Carroll Resume
Megan Carroll Resume
Megan Carroll
 
Trabalho t ecnologias e inova+ -ª++-ªo curricular - oportunidade e desafios-s...
Trabalho t ecnologias e inova+ -ª++-ªo curricular - oportunidade e desafios-s...Trabalho t ecnologias e inova+ -ª++-ªo curricular - oportunidade e desafios-s...
Trabalho t ecnologias e inova+ -ª++-ªo curricular - oportunidade e desafios-s...
Katia CA Souza
 
Safety Track Asset Tracking Units
Safety Track Asset Tracking UnitsSafety Track Asset Tracking Units
Safety Track Asset Tracking Units
safetytrack
 

Viewers also liked (20)

Доклад Сергея Митрофанова на Harvest в Казани
Доклад Сергея Митрофанова на Harvest в КазаниДоклад Сергея Митрофанова на Harvest в Казани
Доклад Сергея Митрофанова на Harvest в Казани
 
Gruzobzor.ru
Gruzobzor.ruGruzobzor.ru
Gruzobzor.ru
 
How many keys
How many keysHow many keys
How many keys
 
Eco vision
Eco visionEco vision
Eco vision
 
Vputi
Vputi Vputi
Vputi
 
Bablocar.ru
Bablocar.ruBablocar.ru
Bablocar.ru
 
(Prensa) recortes de prensa 27 11-2013
(Prensa) recortes de prensa 27 11-2013(Prensa) recortes de prensa 27 11-2013
(Prensa) recortes de prensa 27 11-2013
 
0302 2 perú 2021 premió a 12 empresas por sus responsabilidad social-perú exp...
0302 2 perú 2021 premió a 12 empresas por sus responsabilidad social-perú exp...0302 2 perú 2021 premió a 12 empresas por sus responsabilidad social-perú exp...
0302 2 perú 2021 premió a 12 empresas por sus responsabilidad social-perú exp...
 
(Sector) recortes de prensa 29 07-2013
(Sector) recortes de prensa 29 07-2013(Sector) recortes de prensa 29 07-2013
(Sector) recortes de prensa 29 07-2013
 
Fanzine virtual karina e luana
Fanzine virtual karina e luanaFanzine virtual karina e luana
Fanzine virtual karina e luana
 
Folleto ferrocarril que defiende CGT 2012
Folleto ferrocarril que defiende CGT 2012Folleto ferrocarril que defiende CGT 2012
Folleto ferrocarril que defiende CGT 2012
 
Starobni duchod odchod
Starobni duchod odchodStarobni duchod odchod
Starobni duchod odchod
 
0302 1 perú 2021 premió a 12 empresas por sus responsabilidad social-perú ex...
0302 1  perú 2021 premió a 12 empresas por sus responsabilidad social-perú ex...0302 1  perú 2021 premió a 12 empresas por sus responsabilidad social-perú ex...
0302 1 perú 2021 premió a 12 empresas por sus responsabilidad social-perú ex...
 
CV - Rolando Barragan 2016F
CV - Rolando Barragan 2016FCV - Rolando Barragan 2016F
CV - Rolando Barragan 2016F
 
T&k test analyzers cn
T&k test analyzers cnT&k test analyzers cn
T&k test analyzers cn
 
El arbol mágico modificado.... daniel villanueva
El arbol  mágico modificado.... daniel villanuevaEl arbol  mágico modificado.... daniel villanueva
El arbol mágico modificado.... daniel villanueva
 
Recortes prensa 20131028
Recortes prensa 20131028Recortes prensa 20131028
Recortes prensa 20131028
 
Megan Carroll Resume
Megan Carroll ResumeMegan Carroll Resume
Megan Carroll Resume
 
Trabalho t ecnologias e inova+ -ª++-ªo curricular - oportunidade e desafios-s...
Trabalho t ecnologias e inova+ -ª++-ªo curricular - oportunidade e desafios-s...Trabalho t ecnologias e inova+ -ª++-ªo curricular - oportunidade e desafios-s...
Trabalho t ecnologias e inova+ -ª++-ªo curricular - oportunidade e desafios-s...
 
Safety Track Asset Tracking Units
Safety Track Asset Tracking UnitsSafety Track Asset Tracking Units
Safety Track Asset Tracking Units
 

Similar to Memory managment in i os

Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»
e-Legion
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Глеб Тарасов
 
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. РазноеШкола-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
Глеб Тарасов
 
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиШкола-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Глеб Тарасов
 
2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭ2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭ
Oleg Parinov
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
Andrey Karpov
 
Интуит. Разработка приложений для iOS. Лекция 3. Views
Интуит. Разработка приложений для iOS. Лекция 3. ViewsИнтуит. Разработка приложений для iOS. Лекция 3. Views
Интуит. Разработка приложений для iOS. Лекция 3. Views
Глеб Тарасов
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
drupalconf
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Глеб Тарасов
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
tyomo4ka
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
PVasili
 
Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение
Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжениеШкола-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение
Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение
Глеб Тарасов
 

Similar to Memory managment in i os (20)

Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
 
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. РазноеШкола-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
 
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиШкола-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с данными
 
2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭ2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭ
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
msumobi2. Лекция 1
msumobi2. Лекция 1msumobi2. Лекция 1
msumobi2. Лекция 1
 
Интуит. Разработка приложений для iOS. Лекция 3. Views
Интуит. Разработка приложений для iOS. Лекция 3. ViewsИнтуит. Разработка приложений для iOS. Лекция 3. Views
Интуит. Разработка приложений для iOS. Лекция 3. Views
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)
 
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
 
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловWebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
 
iOS-05_2-UIKit
iOS-05_2-UIKitiOS-05_2-UIKit
iOS-05_2-UIKit
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение
Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжениеШкола-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение
Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение
 
Максим Хромцов "Yandex MapKit для Android OS в примерах"
Максим Хромцов "Yandex MapKit для Android OS в примерах"Максим Хромцов "Yandex MapKit для Android OS в примерах"
Максим Хромцов "Yandex MapKit для Android OS в примерах"
 

More from it-park (20)

Delaidut
Delaidut Delaidut
Delaidut
 
Оценкаремонта.рф
Оценкаремонта.рфОценкаремонта.рф
Оценкаремонта.рф
 
Просто доставка
Просто доставка Просто доставка
Просто доставка
 
Карта добра
Карта добра Карта добра
Карта добра
 
Zig zag
Zig zag Zig zag
Zig zag
 
КИНОБИЛЕТЫ.РФ
КИНОБИЛЕТЫ.РФКИНОБИЛЕТЫ.РФ
КИНОБИЛЕТЫ.РФ
 
Tatar ornament
Tatar ornamentTatar ornament
Tatar ornament
 
Open event
Open eventOpen event
Open event
 
Domscanner
Domscanner Domscanner
Domscanner
 
Nubex.ru
Nubex.ruNubex.ru
Nubex.ru
 
Finbox
FinboxFinbox
Finbox
 
2code.ru
2code.ru2code.ru
2code.ru
 
Нексмед
НексмедНексмед
Нексмед
 
Bonusmall.ru pitch pi
Bonusmall.ru pitch piBonusmall.ru pitch pi
Bonusmall.ru pitch pi
 
kvartirui
kvartiruikvartirui
kvartirui
 
Iq 300
Iq 300 Iq 300
Iq 300
 
Helper auditor
Helper auditorHelper auditor
Helper auditor
 
Wedvice
WedviceWedvice
Wedvice
 
Bookingame
BookingameBookingame
Bookingame
 
Rs logo
Rs logoRs logo
Rs logo
 

Memory managment in i os

  • 1. Управление памятью в iOS - Лучшие Практики
  • 2. Почему об этом столько говорят? • Не полностью автоматоматическое • Не полностью ручное • Нет Garbage Collector под iOS 2
  • 3. Подсчёт ссылок • Alloc (+1) 1 • Retain (+1) 2 • Release (-1) 1 • Release (-1) 0 • Release ПАДЕНИЕ!
  • 4. Владение объектом • Кто сделал init, тот и папа SomeObject *iOwnThis = [[SomeObject alloc] init]; [iOwnThis doYourThing]; [iOwnThis release]; • Временный объект NSNumber* value = [NSNumber numberWithFloat:14.78]; Передача владения - (void) setName: (NSString*)str { [name release]; name = [str retain]; }
  • 5. Договорённость по именованию • Чтобы создать объект и стать его владельцем надо использовать один из следующих методов –alloc –new –copy –mutableCopy 5
  • 6. dealloc • Отвечает за освобождение памяти • Внутри нужно вызвать [super dealloc] • Не рекомндуется вкладывать другую функциональность • Можно сделать [obj release] если obj равен nil • Этот метод нигде кроме [super dealloc] не должен вызываться вручную 6
  • 7. Property в Objective C • Writability –readonly –readwrite • Setter semantic –assign –copy –retain • Atomicity –atomic –nonatomic 7
  • 8. Property • Обьявление @property (writability, setter, atomicity) type *name; @synthesize name = _name; • Использование object.propertyName = newValue; value = object.propertyName; 8
  • 10. Retain property - (void)setSomeInstance:(SomeClass *)aSomeInstanceValue { if (someInstance == aSomeInstanceValue) return; SomeClass *oldValue = someInstance; someInstance = [aSomeInstanceValue retain]; [oldValue release]; } 10
  • 11. Copy property - (void)setStringValue:(NSString *)aString { if (stringValue == aString) return; NSString *oldValue = stringValue; stringValue = [aString copy]; [oldValue release]; } 11
  • 12. NSAutoreleasePool • В него добавляются временные объекты • Автоматически создаётся в главном потоке • *** __NSAutoreleaseNoPool(): Object autoreleased with no pool in place — just leaking • В других потоках надо создавать отдельно
  • 13. AutoreleasePool в главном потоке int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; return retVal; } int main(int argc, char *argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, nil); } } 13
  • 14. Распространённые ошибки - (void) reset { NSNumber * zero = [[NSNumber alloc] initWithInteger:0]; [self setCount:zero]; } Исправленная версия - (void) reset { NSNumber * zero = [[NSNumber alloc] initWithInteger:0]; [self setCount:zero]; [zero release]; } 14
  • 15. Распространённые ошибки • - (void) reset • { • NSNumber * zero = [NSNumber numberWithInteger:0]; • [self setCount:zero]; • [zero release]; • } • Исправленная версия • - (void) reset • { • NSNumber * zero = [NSNumber numberWithInteger:0]; • [self setCount:zero]; • } 15
  • 16. Возвращение Property • - (NSNumber*) count • { • [count retain]; • return count; • } • Исправленная версия • - (NSNumber*) count • { • return count; • } 16
  • 17. Обращение к Property • - (void) reset • { • NSNumber * zero = [NSNumber numberWithInteger:0]; • • self.count = zero; • //Разные вещи!!! • count = zero; • } 17
  • 18. Добавление в массив передаёт владение объектом • - (NSArray *)getPeople { • NSMutableArray *array = [[NSMutableArray alloc] init]; • for (int i = 0; i < 10; i++) { • Person *p = [[Person alloc] init]; • [array addObject:p]; • } • return array; • } • Исправленная версия • - (NSArray *)getPeople { • NSMutableArray *array = [[NSMutableArray alloc] init]; • for (int i = 0; i < 10; i++) { • Person *p = [[Person alloc] init]; • [array addObject:p]; • [p release]; 18
  • 19. Перезапись без release - (void) leak { name = [[NSString alloc] initWithFormat:@"%@-%@",@"John",@"Paul"]; name = @"Chris"; } Исправленная версия - (void) leak { name = [[NSString alloc] initWithFormat:@"%@-%@",@"John",@"Paul"]; [name release]; name = @"Chris"; } 19
  • 20. Повисший указатель - (id) init{ if (self = [super init]) { count = [NSNumber numberWithInteger:0]; } return self; } - (void) logCount { NSLog(@"Count is %@",count); } 20
  • 21. Исправленная версия - (id) init{ if (self = [super init]) { count = [NSNumber numberWithInteger:0]; [count retain]; } return self; } - (void) logCount { NSLog(@"Count is %@",count); } - (void) dealloc { [count release]; } 21
  • 22. Обнуление делегатов - (void)dealloc { self.someObject.delegate = nil; self.someObject = nil; [super dealloc]; } 22
  • 23. Memory Warning • Автоматически делается setView:nil неактивным ViewControllers • Чистим ресурсы в приложении - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application { [[ImageCache sharedImageCache] removeAllImagesInMemory]; } • Подписываемся на Notification NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; [center addObserver:self selector:@selector(whatever:) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; 23
  • 24. Устранение ошибок памяти • Используйте LLVM / Clang статический анализатор • Не overthink управления памятью • Всегда используйте методы доступа; объявить доступа с использованием свойств • Инструмент Инструменты Утечки
  • 25. EXC_BAD_ACCESS • Поставтье брейкпойнт в программе и шагайте до падения • Тактика закомменть и попробуй падает ли • NSZombieEnabled - при падении можно увидеть к объекту какого типа было обращение и какой селектор был вызван
  • 27. Автоматический подсчёт ссылок • По сути - автоматическое исправление всех замечаний найденных статическим анализатором • Не сборка мусора! • Не может решить всех проблем связанных с циклическими ссылками 27
  • 28. Property в ARC • strong - аналог retain. Проперти является владельцем объекта по ссылке • weak - слабая ссылка без владения. Автоматически ставиться в nil когда объект по ссылке удаляется. • unsafe_unretained - синоним assign. Надо использовать вместо weak в iOS 4 • copy - всё попрежнему, объект копируется и создаётся сильная связь 28