在自定义getter和setter方法时使用@property

时间:2015-07-20 13:18:39

标签: ios objective-c iphone

在自定义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中使用的属性是否生效。

2 个答案:

答案 0 :(得分:2)

在这种情况下你绝对应该使用一个属性。

所以考虑这一行:

@property (nonatomic, copy) NSString *lastNameOfSpouse;

这是API的声明。如果您未在界面中包含它,则其他类无法轻松访问此属性。它还承诺,不知何故,此类的对象将响应-lastNameOfSpouse-setLastNameOfSpouse:。承诺可以通过很多不同的方式来实现。一种常见的方法是使用编译器生成的方法。另一种方法是自己实现这些方法。另一种方法是在运行时添加方法实现。另一种方法是使用消息调度系统。有很多选择。您使用哪个选项与界面无关。

在我们拥有属性之前,我们必须在界面中手动声明这两个方法:

@interface Person
- (NSString *)lastNameOfSpouse;
- (void)setlastNameOfSpouse:(NSString *)name;
@end

然后您必须手动编写每个实现。这有点单调乏味(如此单调乏味,entire tool纯粹为你写这些内容而存在)。 ObjC2通过将其称为"属性"来简化此模式。并允许它在一行中声明(以及关于如何实现这些方法的一些提示)。根据请求(@synthesize),编译器将为您创建最常见的实现。后来的编译器创新为您自己未能实现的任何属性自动创建实现。这让事情更加美好。但它只是汇编API承诺的编译器细节。这就是你将它包含在界面中的原因。

答案 1 :(得分:0)

您可以使用自己的getter / setter,并使用生成的getter / setter:

@synthesize lastNameOfSpouse = _lastNameOfSpouse;

- (void)setLastNameOfSpouse:(NSString *)lastNameOfSpouse
{
    _lastNameOfSpouse = lastNameOfSpouse;
    // Add-on code like self.spouse.lastName = name;
}

- (NSString *)lastNameOfSpouse {
    return _lastNameOfSpouse;
}