2011-02-28 44 views
0

我問NSAutoreleasePool,並明白我需要在這種情況下顯式分配autorelease池。可可的默認NSAutoreleasePool?

int main() 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    // Create an array 
    NSArray *month = [NSArray arrayWithObjects:@ ... nill]; 

    [pool drain]; 
} 

在我的其他question,我並不需要釋放NSArray因爲它會被自動釋放。

- (NSArray*) getTodayArray 
{ 

    ... 

    NSArray *res = [NSArray arrayWithObjects: year, month, nil]; 

    return res; 
} 

爲了被對象自動釋放,即使我沒有做任何NSAutorelease,應該有可可分配一些default自動釋放池。 Xcode生成的主要功能非常簡單。

int main(int argc, char *argv[]) 
{ 
    return NSApplicationMain(argc, (const char **) argv); 
} 

它是正確的嗎?如果是這樣,何時以及如何分配?

回答

6

主線程NSRunLoop每次「循環」時創建並銷燬一個NSAutoreleasePool。但是,請注意,當您分離出任何後臺線程時,您需要爲其創建一個自動釋放池(因爲輔助線程默認情況下沒有活動運行循環)。

1

NSApplicationMain首先在NSApplicationMain中創建NSAutoreleasePool實例。正如@Dave所說,NSRunLoop在每個循環中創建並排出NSAutoreleasePool實例。

正如你所知,蘋果的實現和GNUstep實現並不完全相同,但它們是相似的。

GNUstep libs/gui/trunk/Source/Functions.m

int 
NSApplicationMain(int argc, const char **argv) 
{ 
    NSDictionary  *infoDict; 
    NSString    *mainModelFile; 
    NSString  *className; 
    Class   appClass; 
    CREATE_AUTORELEASE_POOL(pool);