【问题标题】:calling a method of current class from a method of another class从另一个类的方法调用当前类的方法
【发布时间】:2010-09-22 18:20:33
【问题描述】:

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

如何从另一个类调用当前类的方法?谁能帮帮我....

提前致谢

编辑1:: 我的代码: 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 类中调用。

我希望现在已经很清楚了。

编辑3:

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

}

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

【问题讨论】:

    标签: iphone objective-c cocoa oop


    【解决方案1】:
    - (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) 将创建名为selectorSEL,而不是作为参数传入的选择器。

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

    即在AsyncConnection.h中:

    @property(retain) ClassA *callbackHandler;
    

    然后:

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

    然后,在 AsyncConnection 中,您可以将回调处理程序直接称为 self.callbackHandler(或 [self callbackHandler])。

    【讨论】:

    • "任何有经验的 Obj-C/iOS/Cocoa 开发人员都会对它感兴趣。"不仅如此,一个相当有经验的人只是想弄清楚目标就完全糊涂了。 :-)
    • callbackHandler 是否有理由成为拥有关系?似乎那样会有连接和创建连接的对象相互拥有。
    • 个人习惯;我通常使用retain 并有一个清理/失效/死亡之吻机制来避免悬空指针。调试膨胀比悬空指针崩溃要容易得多。
    • 感谢 bbum,你是我的救星。你指出了我的错误,它对我来说很好。到目前为止,我只是在 uibuttons 中使用选择器,因此对它们的了解有限,但现在我对选择器的概念更加清晰。再次感谢
    • 太棒了。乐意效劳。祝你好运!
    【解决方案2】:

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

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

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

    【讨论】:

    • 可能你没听懂,我已经在我的原始帖子中添加了示例代码。你能检查一下吗...
    • 如果您正在寻找目标/动作风格的交互,那么您的 ClassB 应该有一个 SEL 类型的实例变量和一个 id 类型的实例变量。如果您希望 ClassB 偶尔向 ClassA 询问一些它需要知道的事情,请考虑使用委托方法。两者都在介绍性材料中得到解决。如果您需要更多详细信息,则必须发布更多详细信息。使用模糊的术语无济于事:您到底想做什么?提供与您的实际项目相关的上下文,以便我们知道建议什么。
    • 我想要你指定的第一件事,即寻找目标/动作风格的交互。
    • 你能给我一些示例代码来帮助我如何实现它
    • 不,因为你没有准确描述你想要做什么。当你不能完全描述你的目标时,期望人们给你源代码是不合理的。
    【解决方案3】:

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

    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 类准备就绪时,使用参数通知 A 类:

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

    只是一个想法。

    【讨论】:

    • 我不确定这是否一定比发送消息更好。它创建了相同的耦合,但对于通知,它是隐藏的和间接的。 NetNewsWire 的创建者的这篇文章解释了故障通知可以是:inessential.com/2007/04/25/thoughts_about_large_cocoa_projects
    • 嗨,玛莎,感谢您的好建议,但我正在研究一个将作为模板重用的类,我必须使用选择器来完成。你能帮我吗?你可以在我的edit3中检查我在做什么
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-18
      • 2017-10-17
      • 2020-11-29
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      相关资源
      最近更新 更多