Необходимо ли использовать autoreleasepool в программе Swift?


на странице 17 из это презентация WWDC14, он скажет

работа с Objective-C? Все равно придется управлять autorelease бассейны
autoreleasepool {/*code */}

что это значит? Означает ли это, что если в моей базе кода нет файлов Objective-C,autoreleasepool {} это не нужно?

на ответ на вопрос есть пример, где autoreleasepool может быть полезно:

- (void)useALoadOfNumbers {
    for (int j = 0; j < 10000; ++j) {
        @autoreleasepool {
            for (int i = 0; i < 10000; ++i) {
                NSNumber *number = [NSNumber numberWithInt:(i+j)];
                NSLog(@"number = %p", number);
            }
        }
    }
}

если код выше переводится на Swift с autoreleasepool упал, будет ли Свифт достаточно умен, чтобы знать, что number переменная должна быть освобождена после первого } (как и некоторые другие языки вообще)?

2 65

2 ответа:

The autoreleasepool шаблон используется в Swift при возврате autorelease объекты (созданные либо вашим кодом Objective-C, либо с использованием классов Cocoa). Элемент autorelease pattern в Swift функциях так же, как и в Objective-C. Например, рассмотрим это быстрое исполнение вашего метода (создание экземпляра NSImage/UIImage объекты):

func useManyImages() {
    let filename = pathForResourceInBundle

    for _ in 0 ..< 5 {
        autoreleasepool {
            for _ in 0 ..< 1000 {
                let image = NSImage(contentsOfFile: filename)
            }
        }
    }
}

если вы запустите это в инструментах, вы увидите график распределения следующим образом:

with autoreleasepool

но если вы делаете это без autorelease пул, вы увидите, что пиковое использование памяти выше:

without autoreleasepool

The autoreleasepool позволяет явно управлять, когда autorelease объекты освобождаются в Swift, так же, как вы были в состоянии в Objective-C.

Примечание: при работе с собственными объектами Swift, как правило, вы не будете получать объекты autorelease. Вот почему в презентации упоминалось предостережение о том, что это нужно только при "работе с Objective-C", хотя я хочу Apple была более ясна в этом вопросе. Но если вы имеете дело с объектами Objective-C (включая классы Cocoa), они могут быть объектами autorelease, и в этом случае это быстрое представление Objective-C @autoreleasepool шаблон по-прежнему полезен.

Если бы вы использовали его в эквивалентном коде Objective-C, то вы бы использовали его в Swift.

будет ли Swift достаточно умен, чтобы знать, что переменная числа должна быть вышел после первого }

только если это делает Objective-C. Оба работают по правилам управления памятью какао.

конечно, АРК это знает number выходит из области видимости в конце этой итерации цикла, и если он сохранил его, он выпустит его там. Однако это не говорит вам, был ли объект автоматически выпущен, потому что -[NSNumber numberWithInt:]может или не может вернулись экземпляр autoreleased. Вы не можете знать, потому что у вас нет доступа к источнику -[NSNumber numberWithInt:].