ios - 试图理解引用周期
<p><p>我正在阅读 Apple 关于 Objective-C 引用周期的文档,然后我尝试创建一个,但我不太了解它的行为。这是我所拥有的:有两个类 <code>XYZPerson</code> 和 <code>XYZPersonSpouse</code>。
他们的名字、姓氏和类型为 <code>NSString</code> 的属性称为 <code>spouseName</code>。在 <code>main</code> 中,我将两个类的 <code>spouseName</code> 属性设置为彼此的名称,如下所示(在两个类的 <code>init</code> 中,我称它们为 <code>designated initializers </code>,其中设置了他们的名字和姓氏):</p>
<pre><code> XYZPerson *person = [ init];
XYZPersonSpouse *spouseOfXYZPerson = [ init];
spouseOfXYZPerson.spouseName = person.firstName;
person.spouseName = spouseOfXYZPerson.firstName;
</code></pre>
<p>我还重写了两个类的 <code>dealloc</code> 方法以在控制台上打印一些文本。现在,因为我不使用 <code>weak</code> 或 <code>unsafe_unretained</code>,在两个类上定义属性 <code>spouseName</code> 时,我假设通过上面我创建的代码强引用循环。但是,稍后我将另一个 <code>NSString</code> 分配为 <code>XYZPerson</code> 类的实例 <code>person</code> 的名称,如下所示:</p>
<pre><code> person.spouseName = @"Julia";
</code></pre>
<p>(但即使没有这个)并运行我的项目,我一直看到 <code>XYZPersonSpouse</code> 类的 <code>dealloc</code> 方法的消息(以及 <code>XYZPerson</code>,也是)。</p>
<p>不应该因为引用循环而仍然不保留类吗?
如果你能解释一下这里发生了什么,我会很感激你的帮助。</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>您没有看到引用/保留周期,因为这不是引用周期。</p>
<p>在您的示例中,<code>person</code> 和 <code>spouseOfPerson</code> 是具有指向其字符串属性 <code>firstName</code> 和 <code>spouseName</code> 的强指针的对象. <strong>这些人员对象之间没有指向彼此的强指针,它们具有指向字符串的强指针。</strong>由于字符串没有对人员对象的强引用,因此不会创建循环。</p >
<p>如果你想创建一个引用循环,你需要对象本身有相互之间的强指针。为此,您需要声明以下属性:</p>
<pre><code>XYZPerson
@property (nonatomic, strong) XYZPersonSpouse *spouse
XYZPersonSpouse
@property (nonatomic, strong) XYZPerson *spouse
</code></pre>
<p>如果您随后执行以下操作而不是设置名称的两行,您将有一个引用循环。</p>
<pre><code>spouseOfXYZPerson.spouse = person;
person.spouse = spouseOfXYZPerson;
</code></pre>
<p>要打破引用循环,请将 <code>spouse</code> 属性更改为 <code>weak</code>。</p></p>
<p style="font-size: 20px;">关于ios - 试图理解引用周期,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/48591900/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/48591900/
</a>
</p>
页:
[1]