2016-12-04 69 views
0

我无意中发现了这个代码从苹果:为什么Apple创建ivars如果@synthesize创建它们?

@interface TiltShift : CIFilter 
{ 
    CIImage *inputImage; 
    NSNumber *inputRadius; 
} 
@property (retain, nonatomic) CIImage *inputImage; 
@property (copy, nonatomic) NSNumber *inputRadius; 
@end 

@implementation TiltShift 

@synthesize inputImage; 
@synthesize inputRadius; 

苹果创造的属性和在同一时间创建实例变量和合成它们。我的问题是:苹果为什么要这样做?

据我知道的Xcode甚至会没有@synthesize创建的声明的属性下划线的ivars。所以,我们已经创建了_inputImage_inputRadius,另一个奇怪的事情是,在给出这个代码的情况下,Xcode如何知道Apple希望将这些属性与ivars没有下划线相关联。

我会做简单:

@interface TiltShift : CIFilter 
{ 
    // CIImage *inputImage; 
    // NSNumber *inputRadius; 
} 
@property (retain, nonatomic) CIImage *inputImage; 
@property (copy, nonatomic) NSNumber *inputRadius; 
@end 

@implementation TiltShift 

// @synthesize inputImage; 
// @synthesize inputRadius; 

,并有下划线的ivars。

而这不仅仅是苹果。我在网上看到了很多来自其他开发人员的代码,这样做,我已经看到了最近的代码。在我看来,这是不好的代码,因为它不可能辨别“真正的”ivars和备份属性的ivars。

创建这样的代码是否有意义?

+3

非常旧的示例代码。这几乎是几年前所需要的。 Objective-C几年前发展起来,只需要'@ property'就行了。 – rmaddy

回答

3

TLDR - 这是在ARC之前的旧代码,属性自动合成之前。我们在这里讨论2011年之前(或2010年?)的代码。

@synthesize不会创建下划线ivars。它将创建与属性名称相同的ivars。

这就是为什么在旧代码中,我们使用诸如@synthesize inputImage = _inputImage;之类的东西来正确强调ivar。

现代autosynthesis(当你不指定@synthesize在所有)将创建下划线的ivars。

你知道,历史上强调的变量是保留给苹果的,所以没有人应该使用它们。

+0

很好的解释,谢谢! – SpaceDog

相关问题