Память и 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 по-прежнему полезно.




Добавить комментарий

Ваш адрес email не будет опубликован.

*

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.