我什么时候需要同时拥有iVar和属性?

时间:2011-11-03 08:19:09

标签: iphone objective-c ios

我看到一些例子有时会声明一个属性以及变量,有时它们不会.e.g。有一段时间我看到这样的代码

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

@end

在其他时候我会遇到

@interface Test : NSObject

@property (nonatomic,retain)UIProgressView* progressView;

@end

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

我使用UIProgressView作为示例。

2 个答案:

答案 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。

相关问题