Objective-c中的"实例变量"和"属性"之间有区别吗?
我对此不是很确定.我认为"property"是一个具有访问器方法的实例变量,但我可能认为是错误的.
Objective-c中的"实例变量"和"属性"之间有区别吗?
我对此不是很确定.我认为"property"是一个具有访问器方法的实例变量,但我可能认为是错误的.
属性是一个更抽象的概念.实例变量实际上只是一个存储插槽,就像 struct 中的插槽一样.通常,其他对象永远不应该直接访问它们.另一方面,属性是对象的一个属性,可以访问(听起来很模糊,应该是这样的).通常一个属性会返回或设置一个实例变量,但它可以使用多个实例变量中的数据,也可以完全不使用.例如:
@interface Person : NSObject {
NSString *name;
}
@property(copy) NSString *name;
@property(copy) NSString *firstName;
@property(copy) NSString *lastName;
@end
@implementation Person
@synthesize name;
- (NSString *)firstName {
[[name componentsSeparatedByString:@" "] objectAtIndex:0];
}
- (NSString *)lastName {
[[name componentsSeparatedByString:@" "] lastObject];
}
- (NSString *)setFirstName:(NSString *)newName {
NSArray *nameArray = [name componentsSeparatedByString:@" "];
NSArray *newNameArray [[NSArray arrayWithObjects:newName, nil] arrayByAddingObjectsFromArray:[nameArray subarrayWithRange:NSMakeRange(1, [nameArray size]-1)]];
self.name = [newNameArray componentsJoinedByString:@" "];
}
- (NSString *)setLastName:(NSString *)newName {
NSArray *nameArray = [name componentsSeparatedByString:@" "];
NSArray *newNameArray [[nameArray subarrayWithRange:NSMakeRange(0, [nameArray size]-2)] arrayByAddingObjectsFromArray:[NSArray arrayWithObjects:newName, nil]];
self.name = [newNameArray componentsJoinedByString:@" "];
}
@end
(注意:上面的代码有缺陷,因为它假定名称已经存在,并且至少有两个组件(例如"比尔·盖茨",而不仅仅是"盖茨").我觉得修正这些假设会让代码的实际意义变得不那么清晰,所以我只是在这里指出,这样就没有人会天真地重复这些错误.)