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
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
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