74 votes

Objectif C - l'Appel à [auto methodName] à partir de l'intérieur d'un bloc?

Je viens de lancer en blocs et je pense qu'ils sont juste ce que je cherche, sauf pour une chose: est-il possible d'appeler une méthode [auto methodName] à partir de l'intérieur d'un bloc?

C'est ce que j'essaie de faire:

-(void)someFunction{
    Fader* fader = [[Fader alloc]init];

    void (^tempFunction)(void) = ^ {
        [self changeWindow:game]; 
        //changeWindow function is located in superclass
    };

    [fader setFunction:tempFunction];
}

J'ai été à la recherche pour un couple de jours et je ne trouve pas de preuve que cela est possible.

Est-ce possible, ou suis-je en train d'essayer d'utiliser les blocs pour quelque chose qu'ils ne sont pas faits pour?

La raison pour laquelle je suis à l'aide de blocs, c'est que j'ai créé un Fader de la classe, et je veux stocker un bloc à exécuter lorsqu'il se termine en fondu.

Merci

EDIT: Ok, j'ai ajouté dans la suggestion, mais je suis encore en train un EXC_BAD_ACCESS erreur...

-(void)someFunction{
    Fader* fader = [[Fader alloc]init];

    __block MyScreen* me = self;

    void (^tempFunction)(void) = ^ {
        [me changeWindow:game]; 
        //changeWindow function is located in superclass
    };

    [fader setFunction:tempFunction];
    [fader release];
}

Peut-être que je ne suis pas autorisé à donner le fader de la fonction...?

142voto

Dave DeLong Points 156978

Oui, vous pouvez le faire.

Notez, cependant, que le bloc conservent self. Si vous finissez le stockage de ce bloc dans un ivar, vous pouvez facilement créer un cycle de conserver, ce qui signifie ni ne le serait jamais libéré.

Pour contourner ce problème, vous pouvez le faire:

- (void) someMethodWithAParameter:(id)aParameter {

  __block MySelfType *blocksafeSelf = self;
  void (^tempFunction)(void) = ^ {
      [blocksafeSelf changeWindow:game];
  };

  [self doSomethingWithBlock:tempFunction];

}

L' __block mot-clé signifie (entre autres choses) que l'objet référencé ne seront pas retenus.

1voto

Mahesh Points 20994

Est-il possible d'appeler une méthode [auto methodName] à partir de l'intérieur d'un bloc?

Oui, pourquoi pas. Si votre tempFunction est une méthode d'instance, vous pouvez le faire. La méthode appelée doit être accessible est la seule restriction.

-1voto

user3073403 Points 1

Je me demande si vous [fader setFunction:tempFunction]; puis est synchrone ou asynchrone. les blocs de la pousser sur la pile.ainsi, dans MRR,si vous n'avez pas le conserver,il sera pop off.

-(void)someFunction{
    Fader* fader = [[Fader alloc]init];

    void (^tempFunction)(void) = ^ {
        [self changeWindow:game]; 
        //changeWindow function is located in superclass
    };

    [fader setFunction:tempFunction];
    //if the tempFunction execute there will be right.
}//there the tempFunction pop off
 //....some thing go on
 //execute the tempFunction will go wrong.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X