Время жизни слабых локальных переменных с ARC
Если у меня есть кусок кода, который выглядит следующим образом:
- (void)testSomething
{
__weak NSString *str = [[NSString alloc] initWithFormat:@"%@", [NSDate date]];
NSLog(@"%@", str);
}
вывод будет (нулевой), потому что нет сильных ссылок на str, и он будет немедленно освобожден после того, как я его выделю. Это имеет смысл и изложено в руководстве «Переход к ARC».
Если мой код выглядит так:
- (void)testSomething
{
__weak NSString *str = [NSString stringWithFormat:@"%@", [NSDate date]];
NSLog(@"%@", str);
}
тогда он правильно печатает текущую дату. Очевидно, вы ожидаете, что он будет работать в мире, не относящемся к АРК, так какstr
будет автоматически освобожден и, следовательно, действителен до выхода из этого метода. Однако в коде с поддержкой ARC люди обычно рассматривают две формы (stringWithFormat
& alloc/initWithFormat
) быть эквивалентным.
Поэтому мой вопрос: гарантированно ли работает код, подобный второму, в ARC? То есть, если у меня есть слабая ссылка на объект, который я получаю через то, что мы обычно рассматриваем как удобный конструктор автоматического освобождения,гарантированный чтобы можно было безопасно использовать эту ссылку в той же области, которую я обычно имел бы без ARC (то есть, пока метод не завершился)?