当你需要为一个对象定义一个协议时,@class会非常方便,该对象通常会与你定义的接口的对象进行交互。使用@class,您可以将协议定义保留在类的标题中。这种授权模式经常用在Objective-C上,通常最好定义“MyClass.h”和“MyClassDelegate.h”。这可能会导致一些混乱的进口问题
@class MyClass;
@protocol MyClassDelegate<NSObject>
- (void)myClassDidSomething:(MyClass *)myClass
- (void)myClass:(MyClass *)myClass didSomethingWithResponse:(NSObject *)reponse
- (BOOL)shouldMyClassDoSomething:(MyClass *)myClass;
- (BOOL)shouldMyClass:(MyClass *)myClass doSomethingWithInput:(NSObject *)input
@end
@interface MyClass : NSObject
@property (nonatomic, assign) id<MyClassDelegate> delegate;
- (void)doSomething;
- (void)doSomethingWithInput:(NSObject *)input
@end
然后,当你使用这个类,你既可以创建类的实例以及与一个import语句
#import "MyClass.h"
@interface MyOtherClass()<MyClassDelegate>
@property (nonatomic, strong) MyClass *myClass;
@end
@implementation MyOtherClass
#pragma mark - MyClassDelegate Protocol Methods
- (void)myClassDidSomething:(MyClass *)myClass {
NSLog(@"My Class Did Something!")
}
- (void)myClassDidSomethingWithResponse:(NSObject *)response {
NSLog(@"My Class Did Something With %@", response);
}
- (BOOL)shouldMyClassDoSomething {
return YES;
- (BOOL)shouldMyClassDoSomethingWithInput:(NSObject *)input {
if ([input isEqual:@YES]) {
return YES;
}
return NO;
}
- (void)doSomething {
self.myClass = [[MyClass alloc] init];
self.myClass.delegate = self;
[self.myClass doSomething];
[self.myClass doSomethingWithInput:@0];
}
我希望我可以给另一个+1只为'鸡,满足蛋' – lukya 2013-07-05 13:25:44
顺便说一句,它确实恢复到'id'评估。 – jheld 2014-05-21 16:19:05
为什么某些人在他们的.h文件中放入'@ class',然后在.m文件中导入必要的头文件,以及其他人可能只是将当前类头文件中的.h文件导入?只是好奇,谢谢。 @bbum – 2014-05-30 20:01:01