菜鸟教程小白 发表于 2022-12-13 04:01:47

ios - __strong 非 ARC 项目中使用的限定符


                                            <p><p>该项目未启用 ARC,但我们(错误地)使用符合 ARC 的代码库 - 特别是一个用于创建 GCDSingleton.h 中定义的单例对象的代码库:</p>

<pre><code>#define DEFINE_SHARED_INSTANCE
+ (id)sharedInstance
{
static dispatch_once_t pred = 0;
__strong static id _sharedObject = nil;
dispatch_once(&amp;pred, ^{
    _sharedObject = ^{return [ init];}();
});
return _sharedObject;
}
</code></pre>

<p>即使共享对象是用 __strong 限定符定义的,这似乎也有效。我想知道为什么这不会导致错误或至少不会导致警告(最新的 Xcode 4.6 和 ios 6 sdk)。此外,由于该项目未启用 ARC,那么 __strong 限定符到底在做什么(如果有的话)?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>在 MRC 代码中,<code>__strong</code> 被简单地忽略了。</p>

<p>我试着编译了一个简单的例子</p>

<pre><code>#import &lt;Foundation/Foundation.h&gt;

int main(int argc, char const *argv[]) {
    __strong NSString * foo = [ initWithFormat:@&#34;Hello, %s&#34;, argv];
    NSLog(@&#34;%@&#34;, foo);
}
</code></pre>

<p>用圆弧</p>

<pre><code>clang -fobjc-arc test.m -S -emit-llvm -o arc.ir
</code></pre>

<p>没有ARC</p>

<pre><code>clang -fno-objc-arc test.m -S -emit-llvm -o mrc.ir
</code></pre>

<p>并区分 llvm IR 输出。</p>

<p>这是<code>diff mrc.ir arc.ir</code>的结果</p>

<pre><code>54a55,56
&gt;   %17 = bitcast %0** %foo to i8**
&gt;   call void @objc_storeStrong(i8** %17, i8* null) nounwind
63a66,67
&gt; declare void @objc_storeStrong(i8**, i8*)
&gt;
</code></pre>

<p>基本上,ARC 和 MRC 之间的唯一区别是添加了一个 <code>objc_storeStrong</code> 调用。</p>

<hr/>

<p>顺便说一下,没有 <code>__strong</code> 限定符的相同代码将产生完全相同的结果,因为 <code>__strong</code> 是 ARC 中变量的默认限定符。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - __strong 非 ARC 项目中使用的限定符,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/18609935/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/18609935/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - __strong 非 ARC 项目中使用的限定符