2010-04-23 4 views

Répondre

4

Vous pourriez avoir - [MyClass startAsynchronousCode] invoquer un rappel:

typedef void(*DoneCallback)(void *); 

-(void) startAsynchronousCode { 
    // Lots of stuff 
    if (finishedCallback) { 
    finishedCallback(self); 
    } 
} 

puis instancier un MyClass comme ceci:

MyClass *myClass = [[MyClass alloc] initWith: myCallback]; 

MyCallBack pourrait ressembler à ceci:

void myCallback(void *userInfo) { 
    MyClass *thing = (MyClass *)userInfo; 
    // Do stuff 
    [thing release]; 
} 
+1

Quand méthode « MyCallBack » se termine wont l'exécution du retour de code à la fin de la méthode qui a appelé le rappel: « startAsynchronousCode 'qui vient d'être relesed? – Robert

+1

Oui, c'est pourquoi il est important que vous ayez terminé avant d'appeler le rappel. Vous n'obtiendrez aucune violation d'accès, sauf si vous vous référez à soi après le rappel. –

+1

Je pense que vous demandez "comment startAsynchronousCode est asynchrone?" dans ton commentaire? L'idiome ci-dessus est destiné à lorsque vous créez un thread et exécutez startAsynchronousCode à partir de ce nouveau thread. –

0

Ce que j'ai toujours fait est maintenu une variable d'instance qui pointe vers l'objet asynchrone.

- (id)init { 
    myClass = [[MyClass alloc] init]; 
    [myClass startAsynchronousCode]; 
} 

- (void)myClassDidFinish:(MyClass *)myClass { 
    [myClass release]; 
} 
1

Vous devez conserver votre objet myClass en interne dans la méthode startAsynchronousCode. Et relâchez-le en interne aussi après la fin.

Ce comportement est utilisé dans NSURLConnection, UIAlertView et d'autres objets asynchrones.

3

Comment invoquez-vous le code asynchrone? Si vous utilisez NSThread +detachNewThreadSelector:toTarget:withObject:, vous constaterez que l'objet cible est conservé par le thread jusqu'à ce qu'il se termine, puis il est libéré. Vous pouvez donc libérer l'objet immédiatement après le message asynchrone.

par exemple.

@implementation MyClass 

-(void) startAsynchronousCode 
{ 
    [NSThread detachNewThreadSelector: @selector(threadMain:) toTarget: self withObject: nil]; 
} 

-(void) threadMain: (id) anObject 
{ 
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 
    // do stuff 
    [pool drain]; 
} 
@end 

Avec ce qui précède, le code suivant est parfaitement sûr:

MyClass* myClass = [[MyClass alloc] init]; 
[myClass startAsynchronousCode]; 
[myClass release]; 
+0

C'est très utile ... Merci. – jfalexvijay

Questions connexes