从另一个类的方法调用当前类的方法

时间:2010-09-22 18:20:33

标签: iphone objective-c cocoa oop

我正在研究一个有一个方法的类A - (void)DoSmthing1。我打电话给  另一个方法 - (void)类B中的DoSmthing2。现在在B类中执行一些操作之后,该方法应该回调一个方法 - (void)DoSmthing3上一个类。

我如何从另一个类调用当前类的方法?有人可以帮帮我....

提前致谢

EDIT1 ::     我的代码: A类

{
-(void) MethodA {

}

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

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 ::

我想做的另一个例子就像下面这样:

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

这里我想在完成B类中的某个任务后调用A类的方法,并且也要从A类调用。

我希望现在很清楚。

EDIT3:

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

以上代码来自第一类

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

}

以上代码来自第二类。在这里,我想调用一个作为选择器传递的第一类方法。

4 个答案:

答案 0 :(得分:2)

听起来您会从阅读介绍材料中受益:The Objective-C Programming LanguageCocoa Fundamentals Guide。此外,您应该阅读面向对象编程的基础知识(在整个网络和亚马逊上有几十个概述)。

基本上,你会混淆一个类(创建一个对象的蓝图,在其最基本的描述中)和一个类的实例(一个给定类的实际“实例化”对象)。在某个地方,您将不得不从一个实例引用另一个实例(如objectB = [[ClassB alloc] init])来发送消息(如[objectB doSomethingAnObjectOfClassBWouldDo])。您可以通过将引用存储为实例变量或存储在集合(数组,字典等)中来实现此目的,该集合是需要“记住”需要与之交谈的类的实例变量。

在你学会用这个平台爬行之前,要意识到你正试图走路是非常重要的。唯一的治疗方法就是学习。很多。 Guided books帮助。

答案 1 :(得分:2)

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

其他课程:

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

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

}

首先,如果您要使用上述模式,请从@selector()中删除@selector(selector)。您已经拥有选择器。执行@selector(selector)将创建名为SEL的{​​{1}},而不是作为参数传入的选择器。

接下来,这似乎是一个奇怪的模式开始;它会起作用,但任何经验丰富的Obj-C / iOS / Cocoa开发人员都会看到它。由于您编写了selector类,因此请使用委托模式。即在实现AsyncConnection的类中。

即,在AsyncConnection.h中:

loadView

然后:

@property(retain) ClassA *callbackHandler;

然后,在AsyncConnection中,您将直接将回调处理程序称为- (void)loadView { AsyncConnection *async =[[AsyncConnection alloc] init]; [async setCallbackHandler: self]; } (或self.callbackHandler)。

答案 2 :(得分:1)

然后新方法: 应该是这样的:

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];

如果不清楚,请告诉我。

我的消化是,通常如果你想避免真正的混乱和调试的噩梦,你应该使用观察者和通知而不是这种交叉方法调用。

使A类成为B类通知的观察者:

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

当在B级准备好时,用parms通知A级:

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

只是一个想法。

答案 3 :(得分:0)

一种选择是在Objective C中使用delegate pattern。让A类的对象将自己传递给B类的对象作为某些方法的处理程序。