2014-04-28 80 views
4

我已經編寫了一個庫,用於根據您在「首選項」類中聲明的@dynamic屬性自動生成NSUserDefaults訪問器(請參閱PAPreferences)。你寫在.m文件屬性是這樣的:如何在Xcode 5中禁用屬性自動合成屬性?

@property (nonatomic, assign) BOOL hasSeenIntro; 

,然後將其添加到.h文件中:

@dynamic hasSeenIntro; 

這工作正常,但如果用戶不小心忘記放在@dynamic那麼編譯器會自動生成一個等效的@synthesize行。將不會有任何警告,但當然我的代碼不會被調用該屬性。

我想知道是否有辦法禁用自動屬性綜合只爲這個類。

更新:

感謝尼古拉的回答,我記得有可能促進LLVM警告,錯誤和與該錯誤包裹申報達到我一直在尋找(一個錯誤的效果,如果將提高用戶忘記指定@dynamic線):

// Ensure we get an error if we forget to add @dynamic for each property 
#pragma clang diagnostic push 
#pragma clang diagnostic error "-Wobjc-missing-property-synthesis" 

@interface Preferences : PAPreferences 

@property (nonatomic, assign) BOOL hasSeenIntro; 
@property (nonatomic, assign) NSInteger pressCount; 

@end 

#pragma clang diagnostic pop 

回答

6

通過代碼無法做到這一點。

有一個編譯器警告(通過Xcode的構建設置「Implicit Synthesized Properties」,CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS來控制),但是您必須在實現文件上手動設置它,所以對於您的情況來說這並沒有什麼幫助。

這裏有另外一個想法:改變你的實現,在PAPreferences而不是子類中使用類別添加屬性。然後,編譯器無法合成訪問器,並且如果缺少@dynamic,將發出警告。

@interface PAPreferences (SynthesizedProperties) 
@property int foo; 
@end 

@implementation PAPreferences (SynthesizedProperties) 
@end 

結果:

> warning: property 'foo' requires method 'foo' to be defined - use @dynamic or provide a method implementation in this category 

另外(或替代地)可以在運行檢測意外合成訪問器和發射在這種情況下的警告期間內省屬性。

+0

感謝您的選擇 - 我不想去類別路由,因爲用戶代碼會有點難以理解。但是,我忘記了屬性合成編譯器的警告。我最終的結果是將這個警告提升爲只針對喜好類的錯誤。 –

0

AFAIK有沒有辦法做到這一點,在以前的版本的Xcode沒有辦法來標記無論您忘了@synthesize一個特定的屬性。只有在運行時你會遇到Unrecognize選擇器錯誤。