从Xcode4和LLVM 2.0了解到新功能“默认情况下为@syntesize”
我尝试了以下代码:
@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,但是编译器(Apple LLVM 2.1)给我一个警告,例如'warning:property'页面'需要定义方法'page' - 使用@synthesize,@ dynamic或者提供一个方法实现'
默认启用@synthesize我还需要做什么? (我也尝试过标志-Xclang -fobjc-nonfragile-abi2,但它们无法识别)。
谢谢
答案 0 :(得分:5)
Apple从非脆弱的ABI中删除了自动@synthesize
功能,原因是它导致的问题或编译器在尝试自动合成属性时产生的不确定性。有关详细信息,请参阅this blog post。
答案 1 :(得分:2)
@synthesize
是必要的,不再需要的是单独的ivar声明。有一次,计划@synthesize是自动的,但有问题,所以计划没有实现。
答案 2 :(得分:2)
重温这个答案,当前版本的LLVM编译器允许隐式合成。但是,对于当前编译器(2012年末),如果要指定ivar名称,则标量属性声明要求您在@synthesize
语句中手动声明属性。不知道为何他们做出区分。
您还需要另外一次手动@synthesize
一个属性,并且在您已导入到源中的类别中声明属性。
如果你想强制显式合成,有一个编译器标志:CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS
不会阻止隐式综合发生,但如果你想强制执行向后兼容性,它会警告你。