Время жизни слабых локальных переменных с ARC

Если у меня есть кусок кода, который выглядит следующим образом:

- (void)testSomething
{
  __weak NSString *str = [[NSString alloc] initWithFormat:@"%@", [NSDate date]];
  NSLog(@"%@", str);
}

на выходе будет (null), потому что нет сильных ссылок на str и он будет немедленно освобожден после того, как я его выделил. Это имеет смысл и описано в руководстве по переходу на ARC.

Если мой код выглядит следующим образом:

- (void)testSomething
{
  __weak NSString *str = [NSString stringWithFormat:@"%@", [NSDate date]];
  NSLog(@"%@", str);
}

то он правильно выводит текущую дату. Очевидно, что в мире без ARC это будет работать, поскольку str будет автоматически освобождена и, следовательно, будет действительна до выхода из этого метода. Однако в коде с поддержкой ARC люди обычно считают эти две формы (stringWithFormat & alloc/initWithFormat) эквивалентными.

Поэтому мой вопрос заключается в том, гарантированно ли код, подобный второму примеру, будет работать под ARC. То есть, если у меня есть слабая ссылка на объект, который я получаю через то, что мы обычно считаем удобным конструктором с автоотключением, гарантируется ли безопасность использования этой ссылки в той же области видимости, которую я обычно имел бы без ARC (то есть до выхода метода)?

5
задан UIAdam 8 February 2012 в 22:54
поделиться