Управление памятью в iOS -Лучшие Практики
Почему об этом столько говорят?• Не полностью автоматоматическое• Не полностью ручное• Нет Garbage Collector под iOS      ...
Подсчёт ссылок• Alloc (+1)      1• Retain (+1)     2• Release (-1)   1• Release (-1)    0• Release      ПАДЕНИЕ!
Владение объектом• Кто сделал init, тот и папа  SomeObject *iOwnThis = [[SomeObject alloc] init];[iOwnThis doYourThing];  ...
Договорённость по именованию• Чтобы создать объект и стать его владельцем  надо использовать один из следующих методов –al...
dealloc• Отвечает за освобождение памяти• Внутри нужно вызвать [super dealloc]• Не рекомндуется вкладывать другую  функцио...
Property в Objective C• Writability  –readonly  –readwrite• Setter semantic  –assign  –copy  –retain• Atomicity  –atomic  ...
Property• Обьявление @property (writability, setter, atomicity) type *name; @synthesize name = _name;• Использование objec...
Assign property- (void)setSomeValue:(SomeVariable*)aSomeVariableValue{    someValue = aSomeVariableValue;}                ...
Retain property- (void)setSomeInstance:(SomeClass *)aSomeInstanceValue{    if (someInstance == aSomeInstanceValue)      re...
Copy property- (void)setStringValue:(NSString *)aString{    if (stringValue == aString)      return;    NSString *oldValue...
NSAutoreleasePool• В него добавляются временные  объекты• Автоматически создаётся в  главном потоке• *** __NSAutoreleaseNo...
AutoreleasePool в главном потокеint main(int argc, char *argv[]) {    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc...
Распространённые ошибки- (void) reset{    NSNumber * zero = [[NSNumber alloc] initWithInteger:0];    [self setCount:zero];...
Распространённые ошибки• - (void) reset• {•     NSNumber * zero = [NSNumber numberWithInteger:0];•     [self setCount:zero...
Возвращение Property• - (NSNumber*) count• {•     [count retain];•     return count;• }• Исправленная версия• - (NSNumber*...
Обращение к Property• - (void) reset• {•     NSNumber * zero = [NSNumber numberWithInteger:0];••     self.count = zero;• /...
Добавление в массив передаёт                    владение объектом• - (NSArray *)getPeople {•     NSMutableArray *array = [...
Перезапись без release- (void) leak{    name = [[NSString alloc] initWithFormat:@"%@-%@",@"John",@"Paul"];    name = @"Chr...
Повисший указатель- (id) init{    if (self = [super init]) {        count = [NSNumber numberWithInteger:0];    }    return...
Исправленная версия- (id) init{    if (self = [super init]) {        count = [NSNumber numberWithInteger:0];        [count...
Обнуление делегатов- (void)dealloc{    self.someObject.delegate = nil;    self.someObject = nil;    [super dealloc];}     ...
Memory Warning• Автоматически делается  setView:nil неактивным ViewControllers• Чистим ресурсы в приложении    - (void)app...
Устранение ошибок памяти• Используйте LLVM / Clang статический  анализатор• Не overthink управления памятью• Всегда исполь...
EXC_BAD_ACCESS• Поставтье брейкпойнт в программе и шагайте до  падения• Тактика закомменть и попробуй падает ли• NSZombieE...
Clang Static Analyzer                        26
Автоматический подсчёт ссылок• По сути - автоматическое исправление всех  замечаний найденных статическим  анализатором• Н...
Property в ARC• strong - аналог retain. Проперти является  владельцем объекта по ссылке• weak - слабая ссылка без владения...
Upcoming SlideShare
Loading in …5
×

Memory managment in i os

596 views
569 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
596
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Memory managment in i os

  1. 1. Управление памятью в iOS -Лучшие Практики
  2. 2. Почему об этом столько говорят?• Не полностью автоматоматическое• Не полностью ручное• Нет Garbage Collector под iOS 2
  3. 3. Подсчёт ссылок• Alloc (+1) 1• Retain (+1) 2• Release (-1) 1• Release (-1) 0• Release ПАДЕНИЕ!
  4. 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. 5. Договорённость по именованию• Чтобы создать объект и стать его владельцем надо использовать один из следующих методов –alloc –new –copy –mutableCopy 5
  6. 6. dealloc• Отвечает за освобождение памяти• Внутри нужно вызвать [super dealloc]• Не рекомндуется вкладывать другую функциональность• Можно сделать [obj release] если obj равен nil• Этот метод нигде кроме [super dealloc] не должен вызываться вручную 6
  7. 7. Property в Objective C• Writability –readonly –readwrite• Setter semantic –assign –copy –retain• Atomicity –atomic –nonatomic 7
  8. 8. Property• Обьявление @property (writability, setter, atomicity) type *name; @synthesize name = _name;• Использование object.propertyName = newValue; value = object.propertyName; 8
  9. 9. Assign property- (void)setSomeValue:(SomeVariable*)aSomeVariableValue{ someValue = aSomeVariableValue;} 9
  10. 10. Retain property- (void)setSomeInstance:(SomeClass *)aSomeInstanceValue{ if (someInstance == aSomeInstanceValue) return; SomeClass *oldValue = someInstance; someInstance = [aSomeInstanceValue retain]; [oldValue release];} 10
  11. 11. Copy property- (void)setStringValue:(NSString *)aString{ if (stringValue == aString) return; NSString *oldValue = stringValue; stringValue = [aString copy]; [oldValue release];} 11
  12. 12. NSAutoreleasePool• В него добавляются временные объекты• Автоматически создаётся в главном потоке• *** __NSAutoreleaseNoPool(): Object autoreleased with no pool in place — just leaking• В других потоках надо создавать отдельно
  13. 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. 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. 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. 16. Возвращение Property• - (NSNumber*) count• {• [count retain];• return count;• }• Исправленная версия• - (NSNumber*) count• {• return count;• } 16
  17. 17. Обращение к Property• - (void) reset• {• NSNumber * zero = [NSNumber numberWithInteger:0];•• self.count = zero;• //Разные вещи!!!• count = zero;• } 17
  18. 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. 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. 20. Повисший указатель- (id) init{ if (self = [super init]) { count = [NSNumber numberWithInteger:0]; } return self;}- (void) logCount{ NSLog(@"Count is %@",count);} 20
  21. 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. 22. Обнуление делегатов- (void)dealloc{ self.someObject.delegate = nil; self.someObject = nil; [super dealloc];} 22
  23. 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. 24. Устранение ошибок памяти• Используйте LLVM / Clang статический анализатор• Не overthink управления памятью• Всегда используйте методы доступа; объявить доступа с использованием свойств• Инструмент Инструменты Утечки
  25. 25. EXC_BAD_ACCESS• Поставтье брейкпойнт в программе и шагайте до падения• Тактика закомменть и попробуй падает ли• NSZombieEnabled - при падении можно увидеть к объекту какого типа было обращение и какой селектор был вызван
  26. 26. Clang Static Analyzer 26
  27. 27. Автоматический подсчёт ссылок• По сути - автоматическое исправление всех замечаний найденных статическим анализатором• Не сборка мусора!• Не может решить всех проблем связанных с циклическими ссылками 27
  28. 28. Property в ARC• strong - аналог retain. Проперти является владельцем объекта по ссылке• weak - слабая ссылка без владения. Автоматически ставиться в nil когда объект по ссылке удаляется.• unsafe_unretained - синоним assign. Надо использовать вместо weak в iOS 4• copy - всё попрежнему, объект копируется и создаётся сильная связь 28

×