2010-07-30 38 views
2

與@property和@synthesize只是實驗:在cocoa2.0確實@property在接口避免變量聲明

@interface Greeter : NSObject 
//{ 
// NSString * name; 
//} 
@property (assign) NSString * name; 
- (NSString *) greeting; 
@end 

這似乎是這樣,如果你使用聲明@財產,你不要一個變量不必在大括號之間聲明它(如果所有的接口變量都是使用@property聲明的,你甚至不需要大括號)。這總是正確的嗎?忽略界面的頂部(包含大括號)是否是一種很好的風格?我一直在使用這兩種技術,並且因冗餘而感到惱火。

回答

2

沒有「可可2.0」。

在Objective-C 2.0中,在the modern runtime上,是的,您可以省略實例變量,並且該屬性將爲您生成它們。在Mac OS X上的The legacy runtime仍需要顯式實例變量。

您不能完全忽略伊娃部分還有,但您可以將其保留爲空。

+0

這是什麼最佳實踐?爲了清晰起見,或者爲了明確的目的而保留它們? – 2011-01-12 17:15:41

+0

@Jess Bowers:我現在離開它們以便從'init'和'dealloc'中引用它們,但是會在Clang 2.0之後將它們排除在外。 – 2011-01-13 03:12:41

0

以下是我第一次發現的網頁,您可以自動讓您合成屬性並在類擴展中聲明新屬性。它也提供了一些有趣的背景故事。

http://www.mcubedsw.com/blog/index.php/site/comments/new_objective-c_features/

至於風格和正確性,我已經使用了過去幾周的主要特性,它使我的代碼看起來很乾淨!我現在可以在我的實現中聲明私有屬性,並且不會將它們暴露在頭部中,使得使用我的類的任何接口都非常簡單且不會混淆使用。

我在使用接口構建器的時候遇到了一個問題,在這個接口構建器中,必須在接口構建器的頭文件中聲明視圖控制器的任何子視圖的iVar,才能將其視爲IBOutlet並將其分配給它。您仍然可以聲明這些@private,然後在您的實現中在類擴展中聲明私有屬性,如果您真的想將其作爲屬性供您使用。

// In your header 
@interface MenuViewController : UIViewController { 
    @private 
    IBOutlet UIButton *buttonPeopleShouldNotKnowAbout; 
} 
@end 

// And in your implementation 
@implementation MenuViewController() 
@property (nonatomic, readwrite, assign) IBOutlet UIButton *buttonPeopleShouldNotKnowAbout; 
@end