我什么时候需要同时拥有iVar和财产?

我看到一些例子有时会声明一个属性,以及其他时候它们不会变化的属性。例如,有时我会看到这样的代码

@interface Test : NSObject { UIProgressView* _progressView; } @property (nonatomic,retain)UIProgressView* progressView; @end 

在其他时候,我会遇到

 @interface Test : NSObject @property (nonatomic,retain)UIProgressView* progressView; @end 

为什么是什么原因? 我正在学习,几乎总是使用属性和variables。

我用UIProgressView作为例子。

这取决于该物业是否是针对一个iVar合成的,还是以其他方式(或针对另一个iVar)派生的。

如果我们有一个类的实例 – 即:

 Test *myTest = [[Test alloc] init]; 

然后基本上属性声明

 @property (nonatomic,retain)UIProgressView* progressView; 

告诉任何对使用接口感兴趣的人,他们可以在这个类的一个实例上访问以下两个函数:

 [myTest progressBar]; [myTest setProgressBar:aProgressBar]; 

而且客观的C也可以让你使用速记符号:

 myTest.progressBar = xxx = myTest.progressBar 

这完全一样的事情。

这两种方法不需要通过与属性同名的iVar来实现,甚至不需要通过iVar(甚至可以执行数据库获取或派生值)。

如果你@synthesize属性(这意味着你希望预编译器为你生成上面的方法),并没有明确指定@synthesize指令的iVar,那么上述方法将自动生成(由于合成方法)来设置或从与属性同名的iVar中获取值(并且实现将包括取决于属性指令的保留/释放逻辑。

如果你没有@snthesize属性,那么你提供自己的实现,它可以是任何你想要的。 也可以@synthesize属性,但包括一个指令,在方法定义中使用不同的iVar:

 @synthesize progressBar=someOtheriVar; 

在这种情况下,您将不会看到与头文件中的属性同名的iVar。

使用ivars而不是属性只有在你需要@protected访问(只能从子类访问)或支持旧的运行时(这两者都需要)时才有用。