属性名称和属性存储位置有什么区别?我必须只使用属性名称或 mm 使用第一个或第二个有什么意义?这是我的例子:
@implementation Car
@synthesize carSpeed = _carSpeed;
-(void) someMethod:(double)speed
{
self.carSpeed = speed; // this is the same am I right?
_carSpeed = speed;
}
@end
属性名称和属性存储位置有什么区别?我必须只使用属性名称或 mm 使用第一个或第二个有什么意义?这是我的例子:
@implementation Car
@synthesize carSpeed = _carSpeed;
-(void) someMethod:(double)speed
{
self.carSpeed = speed; // this is the same am I right?
_carSpeed = speed;
}
@end
当直接访问实例变量(存储位置)时,无法通知其他代码此更改并对此进行处理。使用属性(使用点语法)只不过是向设置器发送消息。
self.carSpeed = speed;
完全一样
[self setCarSpeed: speed];
一旦这使自动 KVO 工作,该属性的观察者将被通知它已更改。
此外,由于这是一条常规消息发送,因此会发生常规消息发送。因此,您可以覆盖子类中的 setter 以更改其行为。或者,您可以更改 getter 和 setter 的实现,以使用其他类型的值存储而不是实例变量,而无需更改任何需要更改或读取该属性值的代码。
在我们拥有 ARC 之前,在任何地方都使用访问器的另一个重要原因是它们应该负责内存管理。
self.carSpeed = speed;
这使用setter方法
然而,
_carSpeed = speed;
通过创建的别名直接使用 ivar 或属性。
使用 。notation 使您可以从类外部访问它们,并且 setter 和 getter 位于公共区域。
而 _carSpeed 使它成为类的本地对象。而且这是一个古老的约定。