Память и autoreleasepool для циклов
Шаблон autoreleasepool используется в Swift при возврате объектов autorelease (созданных либо вашим кодом Objective-C, либо использованием классов Cocoa). autorelease в Swift функционирует так же, как в Objective-C. Для примера можно рассмотреть метод создания объектов NSImage / UIImage:
// // proSwift.ru // func useManyImages() { let filename = pathForResourceInBundle for _ in 0 ..< 5 { autoreleasepool { for _ in 0 ..< 1000 { let image = NSImage(contentsOfFile: filename) } } } }
Если запустить из Инструментов Activity Monitor, то можно увидеть график использования памяти:
Но если вы сделаете это без autoreleasepool, вы увидите, что пиковое использование памяти выше:
Autoreleasepool позволяет вам явно управлять освобождением памяти, когда объекты autorelease деинициализирутся в Swift, так же, как и в Objective-C.
Примечание. При работе с объектами Swift вы, как правило, не будете получать объекты autorelease. Вот почему в начале статьи упоминается оговорка о том, что это нужно только при «работе с Objective-C». Но если вы имеете дело с объектами Objective-C (включая классы Cocoa), они могут быть объектами autorelease, и в этом случае это Swift-представление шаблона Objective-C @autoreleasepool по-прежнему полезно.
Добавить комментарий