我已经在另一个类中初始化了一个自定义类,然后我想从自定义类中运行一个函数,当它完成时,从初始化它的类中调用一个方法。
// 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]
不起作用,但我不知道如何实现这一点,所以非常感谢任何帮助,谢谢。
答案 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 {}