Objective-C:@interface之前的@class指令?
这两个类声明有什么区别? 我不明白为什么在这里使用@class。 谢谢。
@class TestClass; @interface TestClass: UIView { UIImage *image1; UIImage *image2; }
和
@interface TestClass: UIView { UIImage *image1; UIImage *image2; }
@class
存在来打破循环依赖。 假设你有A和Bclass。
@interface A:NSObject - (B*)calculateMyBNess; @end @interface B:NSObject - (A*)calculateMyANess; @end
鸡; 见蛋。 这永远不能编译,因为A的接口依赖于B被定义,反之亦然。
因此,它可以通过使用@class
来@class
:
@class B; @interface A:NSObject - (B*)calculateMyBNess; @end @interface B:NSObject - (A*)calculateMyANess; @end
@class
有效地告诉编译器这样的类存在于某个地方,因此,声明指向所述类的实例的指针是完全有效的。 然而,你不能调用一个实例引用的方法,其types只被定义为一个@class
因为没有额外的元数据可用于编译器(我不记得是否它将呼叫站点恢复为被评估为一个调用通过id
或不)。
在你的例子中, @class
是无害的,但是完全没有必要。
@class TestClass;
这只是声明“类TestClass将被定义”。
在这种情况下(你粘贴的那个)没有任何影响,所以这些都是一样的。
但是,如果你要定义一个使用你的类名的协议(例如传递给委托的参数types),你需要在协议定义之前声明@class TestClass
,因为你的类还没有定义。
一般来说,如果你需要在类定义之前提到你的类名,你将需要首先发出@class
声明
根据Matt的回答,在你的代码中绝对没有指向@class
声明。 @class
forward定义了一个类,以便编译器随后知道你指的是什么types的单元。 由于Objective-C在运行时几乎是无types的,通常编译器实际上需要知道的仅仅是将其与primefacesC值区分开来。
我要在黑暗中刺中,并说,因为实例variables是在@interface
中声明的,你正在看一些旧的代码。 因为它是旧的代码, @class
可能曾经是其他地方(例如,之间有一个委托协议声明),并最终被无害地搁浅。
当你需要为一个对象定义一个协议时,@class是非常方便的,这个对象通常会和你定义的接口对象进行交互。 使用@class,可以将协议定义保存在类的头文件中。 这种授权模式经常用在Objective-C上,通常最好是同时定义“MyClass.h”和“MyClassDelegate.h”。 这可能会导致一些令人困惑的import问题
@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
然后,当你使用这个类的时候,你既可以创build这个类的实例,也可以用一个单一的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]; }