Ce est la magie de NSAutoreleasePool en Objective-C/cocoa framework?
J'ai trouvé un exemple d'Objective-C/cocoa framework a le code suivant.
int main()
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//Create an array
NSArray *month = [NSArray arrayWithObjects:@ ... nill];
[pool drain];
}
-
Q1 : Quelle est la magie de ce (Pourquoi ai-je besoin d'avoir le NSAutoreleasePool code?)? Ce qu'est la magie qui se passe entre les
NSAutoreleasePool
etpool drain
bloc? Je vois que je n'avez pas besoin de libération*month
moi-même. Est-ce parce que c'est à l'intérieur de laNSAutoreleasePool
etpool drain
bloc? -
T2 : Avec Xcode, je suis déjà donné à la fonction main (). Dans ce cas, comment puis-je utiliser le
NSAutoreleasePool
etpool drain
?
Par exemple :
int main(int argc, char *argv[])
{
//NSAutoreleasePool *pool = [[[NSAutoreleasePool] alloc] init];
return NSApplicationMain(argc, (const char **) argv);
}
Vous devez vous connecter pour publier un commentaire.
Q1: La magie, c'est que NSObject -autorelease exemple les appels de méthode NSAutoreleasePool +addObject: méthode de classe. Le NSObject instance est mis en commun dans le courant NSAutoreleasePool instance. Et NSAutoreleasePool -drain exemple les appels de méthode de libération de la méthode de mise en commun des instances.
Il n'est pas exactement le même entre le Cacao de la mise en œuvre d'Apple et GNUstep, mais il est similaire.
Je ne suis pas sûr pourquoi, le mois n'est pas publié, il doit être communiqué par le drain.
Q2: Vous pouvez utiliser NSAutoreleasePool où que vous souhaitez utiliser. Instancier un NSAutoreleasePool signifie la piscine actuelle sera modifiée par la nouvelle instance. drain va arrière de la piscine actuelle de l'instance précédente.
Outre NSApplicationMain ne retourne jamais. Il appelle la fonction de sortie pour quitter l'application et de mettre fin au processus.
Q1:
Vous n'avez pas besoin de relâcher la
month
exemple, dans l'exemple que vous donnez, parce que laNSArray
méthode de la classe que vous appelez (arrayWithObjects:
) renvoie une instance qui est autoreleased. Par convention, le Cacao, les méthodes de la classe que de commencer avec le nom de la classe sera de retour autoreleased les instances de cette classe. Ces exemples:Permettra à la fois de retourner les instances de leurs objets respectifs qui sont autoreleased.
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
codeNSArray *month = [NSArray arrayWithObjects:@ ... nill];
sera autoreleased de toute façon. Est-il correct?main
, aucun autre autorelease pool existe, mais ceux que vous créez; par conséquent, vous devez créer un pool d' (implicitement) autorelease le tableau dans. Sinon, vous obtiendrez un message de log dans votre journal de la console, et le tableau (n'ayant aucune autorelease pool pour le libérer) sera coulé.Je suis assez nouveau à l'Objective-C, mais permettez-moi de vous donner ce que la fissure:
L'autorelease pool est une façon pour Objectif C pour gérer la collecte des ordures dans un peu de moyen plus simple que manuellement.
Il le fait par comptage de références, ou dans ce cas, chaque fois que vous appelez "conserver" ou "libération".
Donc, si vous avez une instance d'un objet "a", vous pouvez faire:
Cela le place dans le AutoreleasePool:
[a autorelease];
Ceci dit l'autorelease pool que vous souhaitez la garder pendant un certain temps:
[a retain];
Lorsque vous appelez
[pool drain]
maintenant, il remarque que vous avez une référence à une, et il ne sera pas libérer la mémoire. Toutefois, si vous appeler plus tard[a release]
, la prochaine fois[pool drain]
est appelé, il va voir qu'il n'y a pas d'autres références à un reste, et de libérer la mémoire.J'ai une intuition que j'ai parlé moi-même dans les cercles sans faire beaucoup de sens, mais ici, c'est l'article de wikipédia sur le comptage de référence: http://en.wikipedia.org/wiki/Reference_counting
retain
etrelease
n'ont rien à voir avec un autorelease pool;autorelease
ajoute le récepteur pour le premier autorelease pool sur l'autorelease pool de pile, de sorte que lorsque la piscine est vidée, la piscine envoyer unrelease
message.[a retain]
"raconte l'autorelease pool que vous souhaitez la garder". Les opérations fondamentales de comptage de référence sontretain
etrelease
; elles n'impliquent pas l'autorelease pool à tous.autorelease
est tout simplement une façon de reporter unerelease
appel jusqu'à ce que plus tard (plus précisément, jusqu'à la prochaine[pool drain]
. Lire la référence fournie par Peter Hosey, puis lisez à nouveau 🙂