gpt4 book ai didi

ios - Objective-C 属性无限循环

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:07:02 25 4
gpt4 key购买 nike

我目前正在学习 Objective-C,这也是我第一次接触编程,所以请多多包涵。

我有一个名为 XYZPerson 的简单对象,它包含一个人的名字、姓氏和对他或她伴侣的引用。合作伙伴也是 XYZPerson 对象。

这是我在 XYZPerson 的标题中声明的内容:

@interface XYZPerson : NSObject

@property (nonatomic, copy) NSString *firstName;
@property (nonatomic, copy) NSString *lastName;
@property (nonatomic, weak) XYZPerson *partner;

@end

在实现中我这样写:

- (void)setPartner:(XYZPerson *)aPartner
{
_partner = aPartner;
aPartner.partner = self;
}

但在 main() 中,每当我调用 personMale.partner = personFemale; 时,它都会创建一个无限循环。

我想我明白为什么(因为 aPartner.partner 调用 setPartner 并再次调用自身),但我找不到解决此问题的优雅解决方案。

如能提供任何帮助(包括对其工作原理的解释),我们将不胜感激!

非常感谢!

最佳答案

问题是这一行:

aPartner.partner = self;

做一些你没有意识到它会做的事情:它只是调用 setPartner: 的简写。设置一个属性调用对应的setter方法;这实际上就是一个属性的真正含义,即调用 setter/getter 方法的一种方式!

但该行 setPartner: 的实现中。所以你现在处于无限递归中:你在调用你自己。就像你说的那样完全:

- (void)setPartner:(XYZPerson *)aPartner
{
_partner = aPartner;
[aPartner setPartner: self];
}

因为这些都是 XYZPersons,所以显然是一个递归。

毕竟,你永远不会这样说:

- (void)setPartner:(XYZPerson *)aPartner
{
[self setPartner: = aPartner];
}

但事实上,这正是您所说的!

当你在二传手中时,正是出于这个原因,你绝不能调用二传手;你应该只引用底层实例变量:

- (void)setPartner:(XYZPerson *)aPartner
{
self->_partner = aPartner;
aPartner->_partner = self;
}

关于ios - Objective-C 属性无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26922318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com