Необходимо ли использовать 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). Элемент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) } } } }
если вы запустите это в инструментах, вы увидите график распределения следующим образом:
но если вы делаете это без 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:]
.