Domanda

Ho letto dell'autoreleasepool ma c'è un punto che non mi è chiaro.Ho alcune funzionalità che utilizzano thread che richiedono una gestione della memoria separata utilizzando autoreleasepool.

Nell'esempio seguente è corretto

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];

   NSString *myString = @"Hello";

   [pool release];
}

È corretto?

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];

   NSString *myString = [[NSString alloc] initWithString:@"Hello"];

   [pool release];
}

o questo?

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];

   NSString *myString = [[NSString alloc] initWithString:@"Hello"];

   [myString release];
   [pool release];
}

La mia domanda è: gli oggetti di proprietà creati nell'ambito del pool di rilascio automatico devono essere rilasciati in modo specifico o vengono curati quando il pool di rilascio automatico viene rilasciato?

Teo

È stato utile?

Soluzione

AutoRelease piscina gestisce gli oggetti autoreleased. Se si possiede un oggetto (tramite alloc o copiare o mantenere) allora si deve rilasciarlo. Così il vostro secondo esempio non è corretto. Come avete assegnato la stringa, si è posseduta e si deve rilasciarlo.

Una piscina autorelease viene creato per il thread principale. (È possibile esaminare la funzione principale, se si desidera). Ogni filo ha bisogno di una piscina autorelease per gestire gli oggetti autoreleased. Ecco perché se si crea un altro thread è necessario creare un pool autorelease per questo thread. Anche se non si crea oggetto autoreleased nel thread, è necessario creare questo come le chiamate di libreria in quel thread possono creare oggetti autoreleased. Anche se si è certi che non vi chiamate di libreria stanno facendo oggetti autoreleased allora si dovrebbe anche creare loro come questo è la migliore pratica, specialmente se si sta lavorando su grande progetto che è stato sviluppato e mantenuto da più persone.

Altri suggerimenti

Hai solo bisogno di creare la propria piscina autorelease quando si crea un gruppo di autoreleased gli oggetti che si desidera raccogliere spazzatura immediatamente. Tuttavia, si è corretta in quanto non si vuole fare riferimento a qualsiasi "autoreleased" oggetti creati dopo aver rilasciato la piscina. oggetti autoreleased (che non venga conservata) vengono distrutte quando la piscina è scarica.

Dal momento che nessuno degli oggetti in vostro esempio sono autoreleased, creando la propria piscina autorelease è essenzialmente un no-op.

Nessuno dei tuoi esempi necessita di un pool di rilascio automatico.I pool di rilascio automatico si occupano solo degli oggetti rilasciati automaticamente:

NSArray *foo = [NSArray array];
NSObject *bar = [[[NSObject alloc] init] autorelease];

La tua prima stringa viene inizializzata utilizzando una stringa letterale e quindi è probabilmente speciale rispetto alla gestione della memoria (forse qualcun altro ne sa di più).La tua seconda corda perde, la piscina non fa differenza.La tua terza corda viene rilasciata correttamente, anche in questo caso il pool non fa la differenza.

Ecco dove avresti bisogno di una piscina:

- (void) someMethodThatRunsOnAThread {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSString *foo = [@"foo" uppercaseString];
    [pool drain];
}

Ecco il foo la corda perderebbe se la piscina non fosse lì.Tieni presente che sto chiamando drain invece di release in piscina – su iOS non c’è differenza, ma negli ambienti di raccolta rifiuti i due differiscono, quindi probabilmente è meglio abituarsi a chiamare quello giusto.

Tieni inoltre presente che potresti aver bisogno di un pool anche se non rilasci automaticamente alcun oggetto, potrebbero esserci molte operazioni di memoria eseguite da qualche parte nel codice che stai chiamando nel tuo metodo.

Pensate che questo dovrebbe essere qualcosa di simile:

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];


   NSString *myString = [[[NSString alloc] initWithString:@"Hello"] autorelease];

   // or create string like this (automatically autoreleased)
   NSString *myString = [NSString stringWithString:@"Hello"];

   [pool release];
}

È necessario inviare un messaggio autorelease, a oggetti all'interno piscina autorelease. Saranno rilasciati quando messaggio di rilascio viene inviato alla piscina.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top