2010-09-22 7 views
-1

Je travaille sur une classe A qui a une méthode - (void) DoSmthing1. Je fais un appel à une autre méthode- (void) DoSmthing2 dans la classe B. Maintenant, après avoir fait quelques opérations dans la classe B, la méthode est supposée rappeler une classe précédente de méthode- (void) DoSmthing3.appelant une méthode de la classe actuelle à partir d'une méthode d'une autre classe

Comment vais-je appeler une méthode de la classe actuelle d'une autre classe ?? Quelqu'un peut-il s'il vous plaît aidez-moi ....

Merci à l'avance

edit1 :: Mon code: Classe A

{ 
-(void) MethodA { 

} 

-(void) MethodB { 
    ClassB *clsB = [[ClassB alloc] init]; 
    [clsB MethodC]; 
} 
} 

Classe B

{ 
    -(void)MethodC:(selector) { 
    //here i want to call MethodA of classA, and i will prefer if it is possible by sending the name of the method as selector in this method(methodC) 

    } 
} 

Edit2 ::

Un autre exemple, je veux faire un petit truc comme follwoin g:

ClassB *b = [[ClassB alloc] nitWithTarget:self selector:@selector(methodfromClassA) object:nil]; 

Ici, je veux appeler une méthode de classe A une fois une tâche dans la classe B est terminée, et que trop de classe A.

J'espère qu'il est beaucoup plus clair maintenant.

Edit3:

- (void)loadView { 
    AsyncConnection *async =[[AsyncConnection alloc] init]; 
    [async getAsync:self callback:@selector(test1)]; 
} 

code ci-dessus est de première classe

-(void)getAsync:(id)anObject callback:(SEL)selector { 
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:anObject 
                      selector:@selector(selector) 
                       object:nil]; 
    [queue addOperation:operation]; 
    [operation release]; 

} 

et code ci-dessus est de la deuxième classe. Ici, je veux appeler une méthode de première classe qui est passée en tant que sélecteur.

Répondre

2
- (void)loadView { 
    AsyncConnection *async =[[AsyncConnection alloc] init]; 
    [async getAsync:self callback:@selector(test1)]; 
} 

Autre classe:

-(void)getAsync:(id)anObject callback:(SEL)selector { 
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] 
     initWithTarget:anObject 
       selector:@selector(selector) 
       object:nil]; 

    [queue addOperation:operation]; 
    [operation release]; 

} 

Tout d'abord, si vous voulez utiliser le modèle ci-dessus, retirez le @selector() de @selector(selector). Vous avez déjà le sélecteur. Faire @selector(selector) va créer le SEL nommé selector et non le sélecteur passé en argument.

Ensuite, cela semble être un motif étrange pour commencer; ça marchera, mais n'importe quel développeur expérimenté de Obj-C/iOS/Cocoa obtiendra les willies qui le regardent. Depuis que vous avez écrit la classe AsyncConnection, utilisez le modèle de délégué. C'est à dire. dans la classe qui implémente loadView.

qui est, en AsyncConnection.h:

@property(retain) ClassA *callbackHandler; 

Et puis:

- (void)loadView { 
    AsyncConnection *async =[[AsyncConnection alloc] init]; 
    [async setCallbackHandler: self]; 
} 

Puis, en AsyncConnection, vous référer au gestionnaire de rappel directement self.callbackHandler (ou [self callbackHandler]).

+0

"tout développeur expérimenté Obj-C/iOS/Cocoa obtiendra les willies qui le regardent." Plus que cela, une personne raisonnablement expérimentée est devenue complètement confuse juste en essayant de comprendre l'objectif. :-) –

+0

Y a-t-il une raison pour que 'callbackHandler' soit une relation propriétaire? On dirait que cela aurait la connexion et l'objet qui crée la connexion se possédant les uns les autres. –

+2

Habitude personnelle; J'utilise généralement 'retain' et j'ai un mécanisme de nettoyage/invalidation/kiss-of-death pour éviter d'avoir des pointeurs qui pendent. Le débogage de la météorisation est beaucoup plus facile que le blocage des pointeurs. – bbum

2

Il semblerait que vous ayez avantage à lire le matériel d'introduction: The Objective-C Programming Language et Cocoa Fundamentals Guide. En outre, vous devriez lire sur les bases de la programmation orientée objet (il existe des dizaines de vues d'ensemble sur le Web et Amazon). Essentiellement, vous confondez une classe (le plan de création d'un objet, dans sa description la plus basique) et une instance d'une classe (un objet réel «instancié» d'une classe donnée). Quelque part vous devrez avoir une référence d'une instance à l'autre (comme objectB = [[ClassB alloc] init]) pour envoyer un message (comme [objectB doSomethingAnObjectOfClassBWouldDo]). Vous pouvez y parvenir en stockant la référence en tant que variable d'instance ou dans une collection (tableau, dictionnaire, etc.) qui est une variable d'instance de la classe qui doit "se souvenir" à qui elle doit parler.

Il est important de réaliser que vous essayez de marcher avant d'avoir appris à explorer avec cette plate-forme. Le seul remède est d'étudier. Beaucoup. Guided books aide.

+0

peut-être que vous ne m'avez pas, j'ai ajouté l'exemple de code dans mon message original. pouvez-vous vérifier que ... – pankaj

+0

Si vous recherchez une interaction cible/style d'action, alors votre ClassB devrait avoir une variable d'instance de type SEL et une de type id. Si vous êtes à la recherche de ClassB pour demander à ClassA quelque chose dont il a besoin de savoir, pensez à utiliser l'approche déléguée. Les deux sont abordés dans le matériel d'introduction. Si vous avez besoin de plus de détails, vous devrez poster plus de détails. Utiliser des termes vagues n'aide pas: EXACTEMENT QUE VOULEZ-VOUS FAIRE? Donnez le contexte en ce qui concerne votre projet actuel afin que nous sachions ce que vous suggérez. –

+0

Je veux la première chose que vous avez spécifiée, c'est-à-dire, la recherche d'une interaction cible/style d'action. – pankaj

1

Puis nouvelle approche: devrait être quelque chose comme:

classB.h

classA *aObj; 

@property(nonatomic, retain) classA *aObj; 

ClassB.m

@synthetize aObj; 

classA.m

// after init class b obj 

[bOjb setAObj:self]; 

classB.m

[aObj whateverMethodOfClassA]; 

Laissez-moi savoir si pas claire.

Mon sugestion, c'est que généralement si vous voulez éviter un vrai désordre et un cauchemar pour déboguer, vous devriez employer des observateurs et des notifications plutôt que ce genre d'appels croisés de méthodes.

Marque classe A un observateur d'une notification de la classe B:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(classA-method-name:) name:@"notification-name" object:class-B-object ]; 

Et lorsque vous êtes prêt en classe B avisent la classe A avec parms:

[[NSNotificationCenter defaultCenter] postNotificationName:@"notification-name" object:self]; 

Juste une idée.

+0

Je ne suis pas sûr que ce soit nécessairement mieux que d'envoyer un message. Il crée le même couplage, mais avec les notifications, il est caché et indirect. Ce message du créateur de NetNewsWire explique les notifications de problème peuvent être: http://inessential.com/2007/04/25/thoughts_about_large_cocoa_projects – Chuck

+0

salut martha, merci pour la grande suggestion mais je travaille sur une classe qui sera réutilisée comme un modèle et je dois le faire en utilisant les sélecteurs. peux-tu m'aider à ça? Vous pouvez vérifier ce que je fais dans mon edit3 – pankaj

+0

Ensuite, vous avez deux façons: – Martha

0

Une option consiste à utiliser le delegate pattern dans l'objectif C. L'objet de la classe A doit passer à un objet de classe B pour être le gestionnaire de certaines méthodes.

Questions connexes