假设我创建了一个类和这样的协议:
@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。
我偶然发现了一个故意的特征,或者这是一个坏主意,最终导致我遇到问题?
由于
答案 0 :(得分:5)
完全故意。
当你写:
@property int aNumber;
这实际上只是简写:
- (int) aNumber;
- (void) setaNumber:(int)value;
和点符号object.property
只是调用这两种方法之一的简写(取决于您是从属性中读取还是分配属性)。
@synthesize
语句只为您编写两种方法。