objective-c - 宣布代表的正确方法是什么?

时间:2014-05-18 15:29:43

标签: ios objective-c class delegates synthesize

我是Objective-c和iOS开发的新手,在我的班级中我宣布了委托协议。

我找到了几个这样做的例子,它们看起来非常相似但有一些差异,我想为自己弄清楚并理解。

示例1:

(链接 - https://stackoverflow.com/a/12660523/2117550https://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

除了这两个差异之外,实际上是相同的。

不同的东西:

  • 在示例1中,我们在协议之前声明@class,是否真的有必要?或者只是最好的做法。第二个例子没有这个声明就可以正常工作。
  • 在示例1中,我们使用@synthesize delegate,因为据我所知它会为该属性创建getter / setter,但我们确实需要它吗?第二个例子没有这个。

这两个例子都很好,我只是想消除我内心的困惑。

谢谢!

2 个答案:

答案 0 :(得分:3)

如果协议方法引用了类,则需要使用@class MyClass。协议方法通常为类提供参数。你不是在你的例子中这样做,所以不需要它。

暂时不需要使用@synthesize。除非您有特殊原因使用它,否则请勿使用它。

答案 1 :(得分:1)

@class告诉编译器在到达@interface之前存在一个类。当两个类/协议头只需要#import时,这很有用。一旦你创建了你的协议,它可能就是这种情况。

@synthesize 使用来创建getter和setter,但现在我们还拥有所谓的自动属性。当您不使用@synthesize时,编译器将创建一个实例变量来保存属性值,并且无论如何都将生成getter和setter。 @synthesize可以让您稍微控制一下这个过程,但不再需要了。