在自定义getter和setter方法时,似乎没有必要使用@property。像这样。
@property (nonatomic) Person *spouse;
@property (nonatomic, copy) NSString *lastName;
@property (nonatomic, copy) NSString *lastNameOfSpouse;
如果我像这样使用自定义 getter 和 setter
- (void)setlastNameOfSpouse:(NSString *)name {
self.spouse.lastName = name;
}
- (NSString *)lastNameOfSpouse {
return self.spouse.lastName;
}
@property 似乎不会合成任何getter 或setter 方法。
我想知道在这个例子中是否还需要使用@property以及@property中使用的属性是否生效。
最佳答案
在这种情况下,您绝对应该仍然使用属性。
所以考虑这一行:
@property (nonatomic, copy) NSString *lastNameOfSpouse;
这是 API 的声明。如果您没有将它包含在您的接口(interface)中,那么其他类将无法轻松访问该属性。它还 promise ,此类的对象将以某种方式响应 -lastNameOfSpouse
和 -setLastNameOfSpouse:
。有很多不同的方式可以兑现 promise 。一种常见的方法是使用编译器生成的方法。另一种方法是自己实现这些方法。另一种方法是在运行时添加方法实现。另一种方法是使用消息调度系统。有很多选择。您使用的选项与界面无关。
在我们拥有属性之前,我们必须在接口(interface)中手动声明这两个方法:
@interface Person
- (NSString *)lastNameOfSpouse;
- (void)setlastNameOfSpouse:(NSString *)name;
@end
然后您必须手动编写每个实现。这有点乏味(乏味到 entire tool 的存在纯粹是为了给你写这些)。 ObjC2 通过将其称为“属性”并允许在单行中声明它(以及一些有关预期如何实现这些方法的提示)来简化此模式。根据请求 (@synthesize
),编译器将为您创建最常见的实现。后来的编译器创新会为您未能自行实现的任何属性自动创建实现。这让事情变得更好了。但这只是包装 API promise 的编译器细节。这就是您将其包含在界面中的原因。
关于ios - 在自定义 getter 和 setter 方法时使用@property,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31517618/