我看到一些例子有时会声明一个属性以及变量,有时它们不会.e.g。有一段时间我看到这样的代码
@interface Test : NSObject
{
UIProgressView* _progressView;
}
@property (nonatomic,retain)UIProgressView* progressView;
@end
在其他时候我会遇到
@interface Test : NSObject
@property (nonatomic,retain)UIProgressView* progressView;
@end
为什么是什么原因?我正在学习,几乎总是使用属性和变量。
我使用UIProgressView
作为示例。
答案 0 :(得分:6)
使用ivars代替属性仅在您需要@protected访问权限(仅从子类访问)或支持旧运行时(需要两者)时才有用。
答案 1 :(得分:3)
取决于属性是针对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设置或获取值的合成方法(并且实现将包括取决于属性指令的保留/释放逻辑。
如果你没有@synthesize属性,那么你提供自己的实现,它可以是你想要的任何东西。也可以@synthesize属性,但包含一个指令,在方法定义中使用不同的iVar:
@synthesize progressBar=someOtheriVar;
在这种情况下,您将看不到与头文件中的属性同名的iVar。