2012-08-11 178 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 


}