Да, вы должны использовать бассейн автореферата в main
. Другая проблема заключается в том, что вы не инициализируете свой объект в testFromNothing
.
Причина: вы должны создавать пулы автоопределения везде, где вводится поток (включая основной поток). Конечно, если этот поток просто использует код C, тогда никакие объекты objc не будут автореализованы, поэтому в этих сценариях это необязательно.
Что касается «Почему?» - ARC также использует автореализацию и ожидает, что пулы авторефератов всегда на месте. Программы должны правильно поддерживать семантику autorelease, так как ARC также предполагает, что она может использовать пулы автоопределений, и именно программист должен правильно настроить пулы автозаполнения (в некоторых контекстах). ARC отличается от GC и очень похож на MRC на операции отсчета ссылок и последовательность, в которой происходят операции отсчета. С помощью GC можно использовать несколько схем сбора (например, вы можете увидеть большой рост до сбора, или сбор может произойти на вторичных потоках), но ARC работает аналогично хорошо структурированным операциям сохранения/выпуска/автоматического резервирования - плюс несколько трюков/расширения.
'code'id res = [[Test alloc] init]; Без @autoreleasepool 'dealloc' еще не звонит. Почему я должен использовать @autoreleasepool в этом случае? – ssgreg
Но в этом примере нет объектов 'autorelease'd, так какая разница? – trojanfoe
@trojanfoe это предположение может быть правильным при его исполнении, но оно зависит от деталей реализации. независимо от того, пул авторесурсов должен существовать при вводе потоков, включая основной поток. – justin