При компиляции с ARC аргументы метода часто оказываются сохраненными в начале метода и выпущены в конце. Эта пара с сохранением/выпуском кажется излишней и противоречит идее, что ARC "выдает код, который вы все равно писали". Никто в те темные дни до ARC не выполнял дополнительный удержание/освобождение по всем аргументам метода только для того, чтобы быть в безопасности, не так ли?
Рассмотрим:
@interface Test : NSObject
@end
@implementation Test
- (void)testARC:(NSString *)s
{
[s length]; // no extra retain/release here.
}
- (void)testARC2:(NSString *)s
{
// ARC inserts [s retain]
[s length];
[s length];
// ARC inserts [s release]
}
- (void)testARC3:(__unsafe_unretained NSString *)s
{
// no retain -- we used __unsafe_unretained
[s length];
[s length];
// no release -- we used __unsafe_unretained
}
@end
При компиляции с Xcode 4.3.2 в режиме выпуска сборка (такая, что я могу ее понять) содержала вызовы objc_retain
и objc_release
в начале и в конце второго метода. Что происходит?
Это не является большой проблемой, но этот дополнительный трафик сохранения/освобождения появляется при использовании инструментов для профилирования чувствительного к производительности кода. Кажется, вы можете украсить аргументы метода с помощью __unsafe_unretained
, чтобы избежать этого дополнительного сохранения/освобождения, как я уже делал в третьем примере, но делать это довольно неприятно.