2014-05-08 1 views
0

Imaginez une situation comme celle-ci:Condition de pile et de pile sur une fonction ou un bloc récursif?

- (void)doSomethingWithView:(UIView)view { 
    for (UIView *oneView in view.subviews) { 
     [self doSomethingWithView:oneView]; 
    } 
} 

ou d'un bloc comme

void (^doSomething)(NSArray *numbers); 

    doSomething = ^void(NSArray *numbers){ 

    // ... bla bla 
    if (condition) { 
     doSomething(numbers); 
    } 

    }; 

Que se passe en termes de pile et tas? Mon sentiment est que les blocs/fonctions peuvent générer beaucoup de choses sur la pile et le tas qui ne sera jamais libéré jusqu'à un point où l'application va planter sans mémoire.

Dois-je courir ce risque?

Répondre

2

Tout dépend de votre code et de la quantité de récursion. Mais dans tous les cas, vous pouvez faire quelque chose comme ceci:

void (^doSomething)(NSArray *numbers); 

    doSomething = ^void(NSArray *numbers){ 

    // ... bla bla 
    if (condition) { 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ull), ^{ 
      doSomething(numbers); 
     }); 
    } 
}; 

dans ce cas, vous lancez à nouveau le bloc, mais en raison du fait que vous utilisezdispatch_async, le retour du bloc externe et la nouvelle bloc continuer séparément dans la file d'attente simultanée.

+0

ahhh, bonne idée! Merci! – SpaceDog

+0

heureux d'helo;) –

Questions connexes