使用属性与不访问ivars之间的区别

使用属性或直接访问ivars的特定性能和行为差异。

对于全局变量,使用它有什么区别:

@interface myClass (){ UIImageView *myView; } -(void)loadView{ [super loadView]; myView = [[UIImageView alloc] initWithFrame:CGrectMake(0,0,100,100)]; } 

这样做:

  @interface myClass (){ } @property (nonatomic, strong) UIImageView *myView; @synthesize myView = _myView; -(void)loadView{ [super loadView]; myView = [[UIImageView alloc] initWithFrame:CGrectMake(0,0,100,100)]; } 

每种方法都有什么好处? 建议总是使用属性的原因是什么?

在第一种情况下,您的实例变量(或ivar) myView对该类是私有的,并且不能被另一个类访问。

在第二种情况下,您提供了一个属性,允许其他类通过合成访问器访问您的ivar。 声明属性的替代方法是编写自己的访问器方法。 @synthesize表示法为你做了。

请参阅声明属性的 Apple文档

总是为每个数据成员创建一个self.name ,并在整个类实现中使用self.name来访问它。 切勿直接访问您自己的数据成员。

以下是使用Properties的一些原因:

  • 属性强制实施访问限制(例如readonly)
  • 属性强制执行内存管理策略(保留,分配)
  • 属性(很少)用作线程安全策略(primefaces)的一部分
  • 属性提供了透明地实现自定义setter和getter的机会。
  • 使用单一方法访问实例变量可提高代码可读性。

您还可以查看: 代码诫命:Objective-C编码的最佳实践

Synthesize使您自动调用getter和setter方法,具体取决于您是尝试读取还是写入值。 对于myView属性:

 myView = newView1; // using direct ivar access myobject.myView = newvew1; // eq [myobject setMyView:newvew1]; where setMyView: is generated for you automatically with respect to assign/retain, the same for reading: newvew1 = myobject.myView; // newvew1 = [myobject myView:newvew1]; 

生成的getter / setter名称可以使用setter = / getter =进行自定义,如果你不需要setter使用readonly。

你无法禁止其他类使用合成的getter和setter,默认情况下,ivars是@protected,如果你想为其他类提供对ivars的访问,你可以在@public下声明它们:

 @interface myClass (){ UIImageView *myView; // this is protected @public UIImageView *myPublicView; // this is public } 

在第一个示例中,您可以直接访问ivar并更改其内容。 在你的第二个例子(属性)中,自动创建了一个ivar来支持该属性,所有你设置和获取属性的调用都是作为消息发送的(例如: [self setMyView:[[UIImageView alloc] initWithFrame:CGrectMake(0,0,100,100)]]; )。 存取方法也是自动创建的。 这意味着您现在正在遵循KVC / KVO协议。 有关此设计的好处的更多信息, 请参见此处