Если у меня есть кусок кода, который выглядит следующим образом:
- (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 (то есть до выхода метода)?