完整性检查。鉴于这种:
@property (readwrite, nonatomic) NSDate *start;
那么这两行代码不是一样的吗?
版本 1:
self.start.description
版本 2:
[self.start description]
即 start.description 调用对象description
上的方法start
。
完整性检查。鉴于这种:
@property (readwrite, nonatomic) NSDate *start;
那么这两行代码不是一样的吗?
版本 1:
self.start.description
版本 2:
[self.start description]
即 start.description 调用对象description
上的方法start
。
是的,它们是相同的,也是[[self start] description]
基本上是的。
在属性周围有一个 setter 和 getter 自动同步。如果您使用 @syncronize 语句,那么您就有机会影响 setter、getter 和属性的命名方式。如果您自动同步属性的名称是_start。getter 名称是 start,setter 名称是 setStart。
所以
something = self.start
实际上调用 getter 和
self.start = something
调用 setter。等价物是:
something = [self start];
[self setStart:something];
如果您想直接访问实例变量,请执行以下操作:
_start = something;
something = _start;
如果您只是使用,@synthesize start;
那么等价的将是:
start = something;
something = start;
这很可能令人困惑,但实际上在使用 setter/getterstart
时解决了实例变量。self.start
当您不使用 ARC 时,这种差异变得非常重要。根据属性参数(例如分配、复制、保留……),自动生成的 getter 和 setter 会为您进行一些内存管理,而当您直接使用实例变量时,内存管理留给您。
是的。两种情况下的结果都是相同的;属性(大部分)只是以传统 Cocoa 风格编写的访问器方法的糖。
我说“主要”是因为存在一些细微的内部差异。属性作为元数据添加到 Objective C 类的运行时描述中。您可以通过一些反思找出已声明为此类的属性列表。此列表不同于以 getter/setter 样式命名的方法列表。