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

Ios 自定义getter和setter方法时使用@property,ios,objective-c,iphone,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 *

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

您可以使用自己的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;
}

在这种情况下,您肯定仍然应该使用属性

考虑到这一点:

@property (nonatomic, copy) NSString *lastNameOfSpouse;
这是API的声明。如果您没有将它包含在接口中,那么其他类就无法轻松访问此属性。它还承诺该类的对象将以某种方式响应
-lastNameOfSpouse
-setLastNameOfSpouse:
。有很多不同的方式可以实现承诺。一种常见的方法是使用编译器生成的方法。另一种方法是自己实现这些方法。另一种方法是在运行时添加方法实现。另一种方法是使用消息调度系统。有很多选择。您使用的选项与界面无关

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

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

然后,您必须手工编写每个实现。这有点乏味(太乏味了,以至于有一个专门为你写这些东西的人)。ObjC2通过将该模式称为“属性”并允许在一行中声明它简化了该模式(同时还提供了一些有关如何实现这些方法的提示)。根据请求(
@synthesis
),编译器将为您创建最常见的实现。以后的编译器创新会自动为您自己未能实现的任何属性创建实现。这让事情变得更加美好。但是,所有这些都只是编译器的细节,是API承诺的总结。这就是为什么要将其包含在界面中。

您还没有阅读文档,是吗?为什么要这样做?当你有
配偶
属性,上面有
姓氏
时,我根本看不出
姓氏的作用。@Popeye我从一本书中复制了代码..-| |如果这是一种代码,我会放下那本书走开。这绝对不是正确的方法。更好的方法是有一个
Person
类,它有一个属性
lastName
,它是
NSString
和一个
party
类,它是
Person
类,然后当你想设置一个人的姓氏时,你可以调用
[[myPersonInstance party]setLastName:@“Jones”]
myPersonInstance
作为它自己的Person实例)@Popeye这不是他已经拥有的吗?我认为这不是他们想要的。特别是由于
@synthesis
现在是自动生成的,因为实现是我自己编写的,所以在@property中使用“strong”或“strong”会有所不同吗?我猜您的意思是“strong”或“copy”(或其他)。如果您自己编写实现,那么这些属性只是调用方的文档。你当然不应该违背他们的要求。