1

Envisagez la situation suivante.Façon rigoureuse d'implémenter des méthodes de délégués asynchrones

-(void) foo { 

    Object * obj = [[Object alloc] init]; 

    obj.delegate = self; 

    [obj excuteAsync]; 
} 

-(void) delegateMethodReturned { 
    // do something 
} 

Ici, executeAync retourne de manière asynchrone après un certain temps. Ainsi, nous ne pouvons pas libérer obj en toute sécurité. Quel est le meilleur modèle de conception pour implémenter une telle situation sans déclarer obj comme un iVar.

Merci

+0

Le meilleur modèle de conception est de faire un iVar. Vous "devez", car cela dure plus longtemps que foo. Simple. Il n'est pas autonome dans foo, donc il ne devrait pas être local à foo. Simple. Tout simplement parce que vous instanciez quelque chose à l'intérieur de foo, cela ne signifie pas qu'il existe conceptuellement seulement dans foo, car dans ce cas, il est beaucoup plus grand que juste foo. Simple! L'affaire est si claire que je dirais que vous "devez" en faire un iVar. – Fattie

Répondre

1

Si vous pouvez cibler iOS4, vous pouvez contourner le rappel asynchrone à l'aide de blocs et de GCD. J'ai trouvé cela utile dans certaines situations, mais votre kilométrage peut varier. Je l'ai trouvé utile dans certaines situations.

+0

Hey .. Je pense que c'est une bonne réponse .. Jamais essayé ça ..Merci –

0
- (void) delegateMethodReturned: (Object *)obj { 
    [obj release]; 
} 

Cependant, l'analyseur statique se plaignent à ce sujet, parce qu'il pense que vous obj eu une fuite dans -foo, que vous avez fait.

+0

En fait, c'est pourquoi j'ai dit «sûr» de libérer. –

+0

@Mahadevan: il n'y a rien de "dangereux" dans cette approche. L'outil a un faux problème connu (vérifiez le bugzilla LLVM). –

+0

Cela devrait fonctionner si vous pouvez garantir que la méthode déléguée sera appelée et appelée seulement une fois. Je ne me ferais pas confiance pour ne jamais apporter de changement qui mènerait à ce que la méthode des délégués soit appelée plus d'une fois ou pas du tout. Je recommanderais d'utiliser un ivar. –

Questions connexes