我是Objective-c和iOS开发的新手,在我的班级中我宣布了委托协议。
我找到了几个这样做的例子,它们看起来非常相似但有一些差异,我想为自己弄清楚并理解。
示例1:
(链接 - https://stackoverflow.com/a/12660523/2117550和https://github.com/alexfish/delegate-example/blob/master/DelegateExample/CustomClass.h)
MyClass.h
#import <BlaClass/BlaClass.h>
@class MyClass; // removed in example 2
@protocol MyClassDelegate <NSObject>
@optional
- (void) myClassDelegateMethod:(BOOL)value;
@end
@interface MyClass : NSObject
@property (nonatomic, weak) id <MyClassDelegate> delegate;
@end
MyClass.m
#import "MyClass.h"
@implementation MyClass
@synthesize delegate; // removed in example 2
- (void) myMethodToDoStuff {
[self.delegate myClassDelegateMethod:YES];
}
@end
示例2: (链接 - http://www.tutorialspoint.com/ios/ios_delegates.htm)
除了这两个差异之外,实际上是相同的。
@class
,是否真的有必要?或者只是最好的做法。第二个例子没有这个声明就可以正常工作。@synthesize delegate
,因为据我所知它会为该属性创建getter / setter,但我们确实需要它吗?第二个例子没有这个。这两个例子都很好,我只是想消除我内心的困惑。
谢谢!
答案 0 :(得分:3)
如果协议方法引用了类,则需要使用@class MyClass
。协议方法通常为类提供参数。你不是在你的例子中这样做,所以不需要它。
暂时不需要使用@synthesize
。除非您有特殊原因使用它,否则请勿使用它。
答案 1 :(得分:1)
@class
告诉编译器在到达@interface
之前存在一个类。当两个类/协议头只需要#import
时,这很有用。一旦你创建了你的协议,它可能就是这种情况。
@synthesize
使用来创建getter和setter,但现在我们还拥有所谓的自动属性。当您不使用@synthesize
时,编译器将创建一个实例变量来保存属性值,并且无论如何都将生成getter和setter。 @synthesize
可以让您稍微控制一下这个过程,但不再需要了。