菜鸟教程小白 发表于 2022-12-13 11:26:09

ios - 关联对象与属性与实例变量之间的区别


                                            <p><p>我一直在研究一些 Objective C 运行时方法,想知道关联对象和属性之间有什么区别。 </p>

<p>我最感兴趣的是它们的底层实现和动态使用其中一个的优缺点,如果一个调用另一个,或者它们是否以任何方式相互关联。</p>

<p>这些是添加每个的三个运行时方法:</p>

<pre><code>class_addProperty (Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount)
</code></pre>

<p>对比</p>

<pre><code>objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy).
</code></pre>

<p>对</p>

<pre><code>class_addIvar(Class cls, const char *name, size_t size, uint8_t alignment, const char *types)
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>立即想到的答案是它们完全不同,但我明白为什么有人可能会混淆。</p>
<h3>属性</h3>
<p>在 OOP 中,一般来说,<em>property</em> 是 <em>instance</em> 的 <em>method</em>,它提供 <em>interface</em> 到读取和/或写入特定的数据成员。</p>
<p>在 Objective-C 中,<code>@syntheisze</code> 指令用于指示编译器创建或指定获取和/或设置类实例的某些数据成员的方法。方法本身通常被称为“getter”和“setter”。</p>
<p>要记住的重要一点是属性是美化的方法。</p>
<p>另一方面,实变量在物理上被赋予空间(内存)来存储它们的数据。假设我们有一个类 <code>NSPerson:</code></p>
<pre><code>@interface NSPerson : NSObject

@property (nonatomic, copy, readwrite) NSString *chosenName;
@property (nonatomic, copy, readonly) NSString*givenName;
@property (nonatomic, copy, readonly) NSString*fullName;

@end

@implementation NSPerson

@synthesize chosenName = _chosenName, givenName = _givenName

- (NSString *)fullName {
    return ;
}

@end
</code></pre>
<p>在这种情况下,<code>@synthesize</code> 指令执行以下操作:</p>
<ul>
<li>创建一个名为 <code>_chosenName</code></li> 的变量
<li>创建一个返回 <code>_chosenName</code></li> 的方法 <code>- (NSString *)chosenName</code>
<li>创建一个方法 <code>- (void)setChosenName:(NSString *)chosenName</code> 将 <code>_chosenName</code> 设置为输入</li>
<li>对 <code>givenName</code></li> 执行与上述相同的三件事
<li>对 <code>fullName</code> 没有任何作用</li>
</ul>
<p>现在,<code>fullName</code> 不需要自己的内存,因为它没有任何东西要存储。出于同样的原因,它也不需要二传手。因为它是只读的,并且我们明确提供了 <code>fullName</code> 的<em>实现</em>,所以我们完成了 - <code>fullName</code> 是一个非常好的属性,因为它是一种方法,1) 不接受任何参数,2) 吐出预期的类型。</p>
<h3>关联对象</h3>
<p>虽然属性几乎是所有主要 OOP 语言的一部分,但 Apple 提供的关联对象对 Objective-C 来说是相当独特的。</p>
<p>一个更好的问题应该是:<em>字段</em>(或<em>实例变量</em>)和<em>关联对象</em>之间有什么区别?</em> p>
<p>字段和关联对象都保存数据 - 与方法/属性不同,它们只是 <code>返回</code> 数据 - 两者都可以绑定(bind)到特定实例。</p>
<p>我认为关联对象的方式是类比。您之前可能已经处理过一些 JSON。 JSON 对象如下所示:</p>
<pre><code>var data = {
    balance: 15.04,
    mood: &#39;hungry&#39;,
    friends: [
         &#39;larry&#39;,
         &#39;momed&#39;,
         &#39;zeus&#39;,
    ]
}
</code></pre>
<p>现在,每个键:例如 <code>balance</code> 都与一个值配对。在这个类比中,键是实例变量。</p>
<p>关联的对象可能在哪里?</p>
<pre><code>var associated = {};
var assc = associated = {};// the INSTANCE data is the KEY of the ASSOCIATIVE ARRAY
assc.extrra = &#34;peekaboo&#34;;
</code></pre>
<p>我意识到这不是一个完美的类比,但我希望它能够理解上面的 <code>associated</code> 就像允许关联对象的 Objective-C 运行时的实现 - 以及关联对象是变量而不是方法。</p>
<h3>编辑:为什么要关联对象?</h3>
<p>我的gas用完了,但我想提一下,关联对象的主要用途是<em>back</em> <em>categories</em> 和 <em>extensions</em> 中的属性不能使用传统字段来存储数据。就 Objective-C 而言,这是两者之间通常的联系。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 关联对象与属性与实例变量之间的区别,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/31917770/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/31917770/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 关联对象与属性与实例变量之间的区别