使用Protocols和@synthesize中的属性作为协议实现的快捷方式

时间:2012-02-01 19:38:37

标签: objective-c

假设我创建了一个类和这样的协议:

@protocol MyProtocol
@required
- (void) doSomething;
@end

@interface MyClass id<MyProtocol>
@property int aNumber;
@end

@implementation MyClass
@synthesize aNumber = aNumber_;
- (void) doSomething { aNumber_++; }
@end

我显然可以通过将它们视为id<MyProtocol>来传递MyClass的实例。但是,如果我正在处理声明为aNumber的内容,我无法访问id<MyProtocol>。这是预期的。

我最近需要这样做。我想继续使用协议来引用我的类的实例(确定运行时),但我也想访问类属性。我发现我可以这样做:

@protocol MyProtocol
@required
- (void) doSomething;
- (int) aNumber;
@end

现在我有一个id<MyProtocol>的实例,我也可以调用[instance aNumber],无需直接编码访问者 - synthesise有效呼叫为我实现协议的这一部分。如果我愿意的话,我也可以添加setter。

我偶然发现了一个故意的特征,或者这是一个坏主意,最终导致我遇到问题?

由于

1 个答案:

答案 0 :(得分:5)

完全故意。

当你写:

@property int aNumber;

这实际上只是简写:

- (int) aNumber;
- (void) setaNumber:(int)value;

和点符号object.property只是调用这两种方法之一的简写(取决于您是从属性中读取还是分配属性)。

@synthesize语句只为您编写两种方法。