2012-08-11 109 views
4

我有一些UIViewController子类,我希望它们共享一个名为session的属性,它处理“已登录”状态。在协议中定义@property

我知道我可以使用父类,但这是非常明确的,所以我想知道我是否可以通过共享协议“强制执行”session属性。

我从来没有见过在协议中定义的显式属性(显然你可以定义setter和getter),那么在协议内定义一个属性是一个可取的模式?

回答

10

@property也可以出现在协议或类别的声明中。

表示在official apple documentation。所以没有问题。

+0

这是个好消息:-) – Besi 2012-08-11 10:10:18

2

您可以在协议中拥有属性,只要符合协议的每个类都具有该属性的相应@synthesize或提供了getter和setter。

+0

但是对于类别类别,您通常不能将实例变量添加到类中。那么协议也没有,但它意味着班级将符合财产。 – Besi 2012-08-11 09:45:31

+0

为什么不使用协议?使用一个类我必须为每个类写一个,而我只需要'@ synthesize'声明的属性。 – mAu 2012-08-11 09:45:50

+0

@mAu:这是一个公平的问题。我重写了我的答案,提及如何使用协议来实现这一点。 – jweyrich 2012-08-11 09:57:03

2

是,使用的协议有可能添加属性:在每一个采用这个协议类

@protocol MyProtocol <NSObject> 

@property (nonatomic, retain) NSFoobar *baz; 

@end 

而且@synthesize baz;(或者你可以使用关键字@optional标记声明的属性为可选)。

+2

新的自动合成在这里很有趣... – 2012-08-11 14:01:14

1

在.h文件中:

@property(nonatomic,strong)UILabel *mylabel; 

在.m文件:

@synthesize mylabel = _mylabel; 

编译器将创建getter和setter方法mylabel。

Ex -> 

-(void)setMylabe:(UILabel *) mylabel { //setter 


} 

-(UIlabel*)mylabel { // getter 


}