所以我一直在尝试组织我的Objective-C代码,因为截至目前,一切都在一个巨大的文件中。 在假设的情况下:
A类的方法是“alertCompleted”和“prepareAlert”。
B类有一个方法“submitPost”。
假设我在A的方法中,“prepareAlert”,我想从中调用B的方法“submitPost”。然后,从“submitPost”方法我需要在A。中调用“alertCompleted”。
正如你所看到的,B和B中的A调用方法调用A中的方法。如果我可以在同一个类中拥有所有方法但我真的需要组织我的代码(上面的方法只是示例),这显然是理想的。我怎么能做到这一点?据我所知,类别只允许类别类调用主类或反之,但不是两种方式,导入彼此标题给我循环依赖。
答案 0 :(得分:3)
这不是一个大问题。您可以使用@class <classname>
创建转发。
ClassA.h
@class B;
@interface A : NSObject
- (void)needsB:(B *)b;
@end
ClassB.h
@class A;
@interface B : NSObject
- (void)needsA:(A *)a;
@end
在.m文件中,您需要导入ClassA.h和ClassB.h
答案 1 :(得分:1)
这是单向的,虽然感觉有些过分:
ClassA.h
#import <Foundation/Foundation.h>
#import "ClassB.h"
@interface ClassA : NSObject
- (void) prepareAlert;
@end
ClassA.m
@implementation ClassA
- (void) prepareAlert {
NSLog(@"Class A: Preparing Alert");
ClassB * bClass = [ClassB new];
[bClass submitPostWithTarget:self andCallback:@selector(handleCompletion)];
}
- (void) handleCompletion {
NSLog(@"Class A: Handled Completion");
}
@end
ClassB.h
#import <Foundation/Foundation.h>
@interface ClassB : NSObject
- (void) submitPostWithTarget:(id)target andCallback:(SEL)callback;
@end
ClassB.m
#import "ClassB.h"
@implementation ClassB
- (void) submitPostWithTarget:(id)target andCallback:(SEL)callback {
NSLog(@"Class B: Submitting Post");
// Callback
IMP imp = [target methodForSelector:callback];
void (*func)(id, SEL) = (void *)imp;
func(target, callback);
}
@end
然后当我想打电话时:
#import "ClassA.h"
跑得像:
ClassA * aClass = [ClassA new];
[aClass prepareAlert];
将打印:
2014-03-14 20:25:05.207 MyApp[52877:60b] Class A: Preparing Alert
2014-03-14 20:25:05.208 MyApp[52877:60b] Class B: Submitting Post
2014-03-14 20:25:05.209 MyApp[52877:60b] Class A: Handled Completion
这样,如果您想从ClassB中调用ClassA的特定实例,它仍然可以工作。