2011-09-21 152 views
2

知道从Xcode4和LLVM 2.0有新功能“默认@syntesize”@synthesize默认问题

我尝试下面的代码:

@interface PDFPage : NSObject 

@property (nonatomic,copy) NSString *name; 
@property (nonatomic,assign) int page; 

@end 

@implementation PDFPage 

-(void)dealloc 
{ 
    [self.name release]; 
    [super dealloc]; 
} 

@end 

我认为@synthesize没有更长的必要,但编译器(苹果LLVM 2.1)给我一个警告,如'警告:属性'页面'需要方法'页'定义 - 使用@synthesize,@dynamic或提供方法实现'

我还有什么需要做的默认情况下启用@synthesize? (我也试过标志-Xclang -fobjc-nonfragile-abi2,但它们不被识别)。

谢谢

回答

5

苹果删除,因为它是导致试图autosynthesize属性时,编译器有问题或不确定性来自非脆弱ABI自动@synthesize功能。有关详细信息,请参阅this blog post

2

@synthesize是必要的,什么不再是必要的是一个单独的伊娃宣言。有一次,计划@synthesize是自动的,但有问题,所以计划没有实现。

2

重温这个答案,当前版本的LLVM编译器允许隐式合成。但是,使用当前编译器(2012年末),如果要指定伊娃尔名称,则标量属性声明要求您手动声明@synthesize语句中的属性。不知道为什么他们做出了区分。

还有一次,您需要手动@synthesize属性,并且这是在您已导入到源中的类别中声明的属性。

如果你想强制显式合成,有一个编译器标志:CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS不会停止发生隐式合成,但是如果你想强制向后兼容,会发出警告。