1

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

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

4 回答 4

2

我是objective-c的新手,所以请多多包涵。

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

实现您想要的一种方法是通过“组合”,这意味着编写 A 使其具有作为 B 实例的成员变量。然后 A 可以使用 B 的该实例来调用 B 中的方法:

啊:

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

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

@end

.

是:

#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

.
乙:

#import <Cocoa/Cocoa.h>

@interface B : NSObject {

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

@end

.
体重:

#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 中调用一个类方法。

啊:

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

@interface A : NSObject {

}
- (void)methodA;

@end

是:

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

@implementation A

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

@end

乙:

#import <Cocoa/Cocoa.h>

@interface B : NSObject {

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

@end

体重:

#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
于 2013-07-06T01:07:16.877 回答
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 类 init 方法中,您将注册以接收该通知:

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

于 2013-07-06T03:14:23.597 回答
0
#classA.m

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

#classB.m    

[classAInstance methodA:self];
于 2013-07-06T00:42:39.143 回答
0

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

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

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

// classB.m
+ (void)somthingB {}
于 2013-07-06T00:59:33.593 回答