我什么时候需要同时拥有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访问(只能从子类访问)或支持旧的运行时(这两者都需要)时才有用。