2013-03-05 7 views
1

ARC включен. Почему метод dealloc не звонит? Должен ли я использовать @autoreleasepool здесь или нет? Зачем? Спасибо.ARC включен. Почему метод dealloc не звонит?

@interface Test : NSObject 
@end 

@implementation Test 

+(id)testFromNothing 
{ 
    id res = [Test alloc]; 
    return res; 
} 

-(void)dealloc 
{ 
    NSLog(@"deallocated"); 
} 

@end 


int main(int argc, const char * argv[]) 
{ 
    Test* test = [Test testFromNothing]; 
    return 0; 
} 

ответ

5

Да, вы должны использовать бассейн автореферата в main. Другая проблема заключается в том, что вы не инициализируете свой объект в testFromNothing.

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

Что касается «Почему?» - ARC также использует автореализацию и ожидает, что пулы авторефератов всегда на месте. Программы должны правильно поддерживать семантику autorelease, так как ARC также предполагает, что она может использовать пулы автоопределений, и именно программист должен правильно настроить пулы автозаполнения (в некоторых контекстах). ARC отличается от GC и очень похож на MRC на операции отсчета ссылок и последовательность, в которой происходят операции отсчета. С помощью GC можно использовать несколько схем сбора (например, вы можете увидеть большой рост до сбора, или сбор может произойти на вторичных потоках), но ARC работает аналогично хорошо структурированным операциям сохранения/выпуска/автоматического резервирования - плюс несколько трюков/расширения.

+1

'code'id res = [[Test alloc] init]; Без @autoreleasepool 'dealloc' еще не звонит. Почему я должен использовать @autoreleasepool в этом случае? – ssgreg

+0

Но в этом примере нет объектов 'autorelease'd, так какая разница? – trojanfoe

+2

@trojanfoe это предположение может быть правильным при его исполнении, но оно зависит от деталей реализации. независимо от того, пул авторесурсов должен существовать при вводе потоков, включая основной поток. – justin