Необходимо ли использовать 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 ответа:
The
autoreleasepoolшаблон используется в Swift при возвратеautoreleaseобъекты (созданные либо вашим кодом Objective-C, либо с использованием классов Cocoa). Элементautoreleasepattern в Swift функциях так же, как и в Objective-C. Например, рассмотрим это быстрое исполнение вашего метода (создание экземпляраNSImage/UIImageобъекты):func useManyImages() { let filename = pathForResourceInBundle for _ in 0 ..< 5 { autoreleasepool { for _ in 0 ..< 1000 { let image = NSImage(contentsOfFile: filename) } } } }если вы запустите это в инструментах, вы увидите график распределения следующим образом:
но если вы делаете это без autorelease пул, вы увидите, что пиковое использование памяти выше:
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:].

