2014-05-07 17 views
12

Voglio sapere quali sono le differenze tra NSAutoreleasePool e il blocco @autoreleasepool. Ho ricevuto una serie di domande ma non ho ricevuto alcuna risposta soddisfacente. Fino ad ora sono venuto a sapere che in ARC non è possibile utilizzare NSAutoreleasePool e Il blocco @autoreleasepool può essere utilizzato in entrambi i casi ARC enabled and disabled. Pertanto, in che senso sono diversi internamente a comportarsi in questo modo.Qual è la differenza tra NSAutoreleasePool e il blocco @autoreleasepool?

E 'necessario per rilasciare gli oggetti in un ambiente disabile ad arco, anche se stiamo usando NSAutoreleasePool o il blocco @autoreleasepool o che lo farà automaticamente? Inoltre, se la memoria ARC rilascio automaticamente allora perché usiamo @autoreleasepool block.Per favore dammi una breve panoramica con l'esempio.

+3

Dalla mela documenti dice che se si utilizza l'arco non è possibile utilizzare NSAutoreleasePool è necessario utilizzare @autoreleasepool. Guarda oltre https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSAutoreleasePool_Class/Reference/Reference.html – Sandeep

+0

Ho visto questo nel link sopra: -Importante: Se usi Automatic Conteggio di riferimento (ARC), non è possibile utilizzare direttamente i pool di autorelease. Invece, si usano i blocchi @autoreleasepool. – Imran

+0

possibile duplicato di [Perché Xcode 4.2 utilizza @autoreleasepool in main.m invece di NSAutoreleasePool?] (Http://stackoverflow.com/questions/8714875/why-does-xcode-4-2-use-autoreleasepool-in- main-m-instead-of-nsautoreleasepool) –

risposta

7

Una differenza che lei ha citato:

In ARC non possiamo usare NSAutoreleasePool e blocco @autoreleasepool può essere utilizzato sia in ARC abilitato e disabilitato caso.

ma per voi questa dichiarazione:

Inoltre, se la memoria di rilascio ARC automaticamente allora perché usiamo @autoreleasepool bloccare

ARC non rilascia la memoria automaticamente! È una funzione di compilazione del tempo in cui ogni oggetto viene inviato un autorelease e va al pool locale. Una volta che il suo ciclo di vita e la sua portata sono finiti, il sistema operativo del pool si libera e il rilascio di tutti gli oggetti.

È possibile fare riferimento questo blog Are @autoreleasepool Blocks More Efficient?

E 'necessario rilasciare gli oggetti in un arco ambiente disabilitato anche se stiamo usando NSAutoreleasePool o @autoreleasepool bloccare o lo faranno automaticamente?

è necessario per rilasciare gli oggetti. Come da definizione di (@/NS)autoreleasepool, non gestisce l'oggetto conserva conta, ma è utilizzato solo per i seguenti:

blocchi piscina autorelease forniscono un meccanismo per cui si può rinunciare proprietà di un oggetto, ma evitare la possibilità di esso è deallocato immediatamente (ad esempio quando si restituisce un oggetto da un metodo ).

+1

Grazie Anoop per la risposta. C'è un'altra domanda, cioè è necessario rilasciare gli oggetti in un ambiente disabilitato, anche se stiamo usando il blocco NSAutoreleasePool o @autoreleasepool o lo faranno automaticamente? – Imran

2

La classe NSAutoreleasePool viene utilizzato per supportare il sistema di gestione di memoria di riferimento contati di cacao. Un pool autorelease memorizza gli oggetti a cui viene inviato un messaggio release quando il pool stesso viene scaricato.

Inoltre, se si utilizza il conteggio di riferimento automatico (ARC), non è possibile utilizzare i pool di autorelease direttamente. Invece, si usano i blocchi @autoreleasepool.Ad esempio, in luogo di:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
// Code benefitting from a local autorelease pool. 
[pool release]; 

si può scrivere:

@autoreleasepool { 
    // Code benefitting from a local autorelease pool. 
} 

@autoreleasepool blocchi sono più efficienti utilizzando un'istanza NSAutoreleasePool direttamente; puoi anche usarli anche se non usi ARC.

È possibile fare riferimento al documento di Apple per maggiori dettagli:

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSAutoreleasePool_Class/Reference/Reference.html

Problemi correlati