从父类调用方法

时间:2013-07-06 00:39:16

标签: objective-c

我已经在另一个类中初始化了一个自定义类,然后我想从自定义类中运行一个函数,当它完成时,从初始化它的类中调用一个方法。

// classA.m

-(void)methodA {
    // do some complicated stuff
    if (result) {
        [classB methodB];
    }
}

// classB.m    

-(void)methodA {
    classAInstance = [[classA alloc] init];
    [classAInstance methodA];
}

-(void)methodB {
    // got result, do more stuff
}

[classB methodB]不起作用,但我不知道如何实现这一点,所以非常感谢任何帮助,谢谢。

4 个答案:

答案 0 :(得分:2)

  

我是Objective-c的新手,所以请耐心等待。

如果你不介意,我会为这件衣服穿上衣服。

实现你想要的东西的一种方法是通过'composition',这意味着写A以便它有一个成员变量是B的实例。然后A可以使用B的这个实例来调用B中的方法:

A.H:

#import <Cocoa/Cocoa.h>
#import "B.h"

@interface A : NSObject {
    B* my_b;
}
- (id)init:(B*)b;
- (void)methodA;

@end

A.M:

#import "A.h"

@implementation A

- (id)init:(B*)b
{
    if (![super init])
    {
        return nil;
    }

    my_b = b;

    return self;
}

- (void)methodA 
{
    [my_b methodB];
}

@end


B.h:

#import <Cocoa/Cocoa.h>

@interface B : NSObject {

}
- (void)do_stuff;
- (void)methodB;

@end


B.m:

#import "B.h"
#import "A.h"

@implementation B

- (void)do_stuff
{
    A* a = [[A alloc] init:self];
    [a methodA];
}

- (void)methodB
{
    NSLog(@"hello");
}

@end

===

因为你写道:

[classB methodB];

...也许你想在B中调用一个类方法。

A.H:

#import <Cocoa/Cocoa.h>
#import "B.h"

@interface A : NSObject {

}
- (void)methodA;

@end

A.M:

#import "A.h"
#import "B.h"

@implementation A

- (void)methodA 
{
    [B classMethodB];
}

@end

B.h:

#import <Cocoa/Cocoa.h>

@interface B : NSObject {

}
+ (void)classMethodB;
- (void)do_stuff;

@end

B.m:

#import "B.h"
#import "A.h"

@implementation B

- (void)do_stuff
{
    A* a = [[A alloc] init];
    [a methodA];
}


+ (void)classMethodB   //Note the '+'
{
    NSLog(@"hello");
}

@end

答案 1 :(得分:1)

我认为其他海报在这里忽略了一些非常重要的东西:保留周期。尝试引用其父对象的任何子方法都需要使用弱引用或__unsafe_unretained修饰符。如果不这样做,则存在将父对象捕获到保留周期的风险。如果我理解了这个问题,那么当某个方法在类'B'对象中完成时,你只想调用类'A'对象中的方法?我通常采用以下两种方式之一:委托和协议(更难的概念)或NSNotificationCenter(不太困难的概念)。在您的情况下,由于您只是尝试在另一个类中的另一个方法完成时“通知”一个方法,因此通知中心似乎更容易使用。这里有一个非常好的教程:http://blog.isotoma.com/2009/11/on-objective-c-delegates-and-nsnotification-objects/但这里是基本前提:

在方法结束时进行工作的方法(在B类中),你插入这样的东西:

NSNotification* notification = [NSNotification notificationWithName:@"MyNotification" object:self];  
[[NSNotificationCenter defaultCenter] postNotification:notification];

然后,在A类初始化方法中,您将注册接收该通知:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MethodToCallAfterNotification:) name:@"MyNotification" object:nil];

每当B类方法完成时,它将广播“MyNotification”通知。您的A类对象正在侦听这些通知,因此无论何时在您的应用中广播该通知,它都会自动调用您指定的选择器。

请务必在类A实现文件中创建一个dealloc方法,并取消注册观察者,如下所示:

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"MyNotification" object:nil];

如果您有兴趣通过弱引用的委托方法调用来学习如何执行此操作,我在此处发布了一个答案:https://stackoverflow.com/a/10273551/1318525

答案 2 :(得分:0)

#classA.m

-(void)methodA:(classB *)classB {

#classB.m    

[classAInstance methodA:self];

答案 3 :(得分:0)

在调用方法之前,您必须初始化类的对象以调用显式方法...如

// classA.m
- (void)somethingA{ }

如果方法是类的隐式方法,那么您的代码将起作用,您不需要创建或初始化类对象,但请记住,隐式方法只能由类调用..如

// classB.m
+ (void)somthingB {}