立即想到的答案是它们完全不同,但我明白为什么有人可能会混淆。
属性
在 OOP 中,一般来说,property 是 instance 的 method,它提供 interface 到读取和/或写入特定的数据成员。
在 Objective-C 中,@syntheisze 指令用于指示编译器创建或指定获取和/或设置类实例的某些数据成员的方法。方法本身通常被称为“getter”和“setter”。
要记住的重要一点是属性是美化的方法。
另一方面,实变量在物理上被赋予空间(内存)来存储它们的数据。假设我们有一个班级NSPerson:
@interface NSPerson : NSObject
@property (nonatomic, copy, readwrite) NSString *chosenName;
@property (nonatomic, copy, readonly) NSString *givenName;
@property (nonatomic, copy, readonly) NSString *fullName;
@end
@implementation NSPerson
@synthesize chosenName = _chosenName, givenName = _givenName
- (NSString *)fullName {
return [NSString stringWithFormat:@"%@ %@", self.chosenName, self.givenName];
}
@end
在这种情况下,@synthesize 指令执行以下操作:
- 创建一个名为
_chosenName的变量
- 创建一个返回
_chosenName的方法- (NSString *)chosenName
- 创建一个方法
- (void)setChosenName:(NSString *)chosenName 将 _chosenName 设置为输入
- 对
givenName 执行与上述相同的三件事
- 对
fullName 没有任何作用
现在,fullName 不需要自己的内存,因为它没有任何东西要存储。出于同样的原因,它也不需要二传手。因为它是只读的,并且我们已经明确提供了fullName 的实现,所以我们完成了 - 而fullName 是一个非常好的属性,因为它是一种 1) 不带参数的方法,和 2) 吐出预期的类型。
关联对象
虽然属性几乎是所有主要 OOP 语言的一部分,但 Apple 提供的关联对象对 Objective-C 来说是相当独特的。
一个更好的问题应该是:字段(或实例变量)和关联对象之间有什么区别? p>
字段和关联对象都保存数据 - 与方法/属性不同,只有 return 数据 - 两者都可以绑定到特定实例。
我认为关联对象的方式是类比。您之前可能已经处理过一些 JSON。 JSON 对象如下所示:
var data = {
balance: 15.04,
mood: 'hungry',
friends: [
'larry',
'momed',
'zeus',
]
}
现在,每个键:例如balance,都与一个值配对。在这个类比中,键是实例变量。
关联的对象可能在哪里?
var associated = {};
var assc = associated[data] = {}; // the INSTANCE data is the KEY of the ASSOCIATIVE ARRAY
assc.extrra = "peekaboo";
我意识到这不是一个完美的类比,但我希望它能够理解上面的 associated 就像允许关联对象的 Objective-C 运行时的实现——并且关联对象是变量而不是方法。
编辑:为什么要关联对象?
我的gas用完了,但我想提一下,关联对象的主要用途是back categories 和 extensions 中的属性不能使用传统字段来存储数据。就 Objective-C 而言,这是两者之间通常的联系。