菜鸟教程小白 发表于 2022-12-13 05:13:40

ios - 我可以实现一个属性 setter ,它通常调用另一个方法来执行设置吗?


                                            <p><p>考虑以下 setter :</p>

<pre><code>- (void)setWinterStatus:(NSString *)status
{
    NSLog(@&#34;Variable update called&#34;);
    if (_status != status)
    {
      ;
      _status = ;
      NSLog(@&#34;Variable actually updated&#34;);
    }
}

- (void)setCharacterState:(EnumCharacterState)state
{
    NSLog(@&#34;Variable update called&#34;);
    if (_state != state)
    {
      _state = state;
      NSLog(@&#34;Variable actually updated&#34;);
    }
}
</code></pre>

<p>注意这些方法是相似的——它记录一条通用消息,检查它是否真的在改变,影响改变,如果改变了,就记录下来。如果我有足够的这样的方法,我可能想写一个包装器,这样我就可以简单地写:</p>

<pre><code>- (void)setCharacterState:(EnumCharacterState)state
{
    ;
}
</code></pre>

<p>但我不确定这是否可能。我不能使用 KVO,因为似乎默认添加的 KVO 代码实际上调用的是 setter,所以这样做会导致无休止的递归。我不知道如何从<code>@selector(state)</code>获取<em>instance</em>变量,也不知道是否需要<code>release/retain</code>。有什么办法吗?</p>

<p>注意:对象类型的基类必须保持<code>NSObject</code>;我不能使用 <code>NSManagedObject</code> 作为基础来处理我自己的 KVO。</p>

<p>编辑:</p>

<p>所以显然有一种使用运行时 c 函数的方法(请参阅接受的答案);似乎可能需要一些时间才能正确,但我在此期间找到了另一个解决方案。我将自己注册为所有我想要“包装”的方法的观察者,观察 <code>NSKeyValueObservingOptionNew</code>、<code>NSKeyValueObservingOptionOld</code> 和 <code>NSKeyValueObservingOptionPrior</code>。然后在前面的处理程序中,我 <code>NSLog(@"Variable update called")</code>,在更新处理程序中,我 <code>NSLog(@"Variable 实际上更新了")</code>。这似乎运作良好:)</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p><strong>简答</strong>:可以,但不要。</p>

<p><strong>长答案</strong>:</p>

<p>假设您出于教育原因想要这样做(而不是仅仅让编译器为您创建 setter,最近的编译器中的默认设置)这是可能的,但这并不重要。</p>

<p>您已经注意到一个区别——是否需要保留/释放(假设为 MRC)——但还有更多区别。例如,考虑简单的一行:</p>

<pre><code>_state = state;
</code></pre>

<p>它有什么作用?复制一个字节?两个字节?八个字节?代码在不同的 setter 中可能<em>看起来</em>相同,但它会编译成不同的机器码。</p>

<p>然后属性上还有复制和弱属性要考虑...</p>

<p><em>还在考虑这样做吗?</em></p>

<p>您需要熟悉 <code>void **</code> 的含义,通过指针复制可变长度的数据等。然后看看 <code>object_setInstanceVariable</code>,<code>property_getAttributes</code> 等 - 这些都是 C 函数,您可以在 <a href="https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/index.html" rel="noreferrer noopener nofollow">Objective-C Runtime Reference</a> 中找到它们.</p>

<p>从中您会发现您需要了解<a href="https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html#//apple_ref/doc/uid/TP40008048-CH100" rel="noreferrer noopener nofollow">type encodings</a> (这将帮助您确定要复制多少字节)等等......</p>

<p>玩得开心!</p>

<p>HTH</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 我可以实现一个属性 setter ,它通常调用另一个方法来执行设置吗?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/28294838/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/28294838/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 我可以实现一个属性 setter ,它通常调用另一个方法来执行设置吗?