菜鸟教程小白 发表于 2022-12-12 09:57:54

ios - @""在幕后究竟做了什么?


                                            <p><p>当使用 <code>= @""</code> 给 <code>NSString</code> 一个值时,该简写到底是什么意思?我注意到,在应用程序中所有其他条件都相同,使用 <code>@""</code> 制作的全局 <code>NSString</code> 不需要使用 <code>retain</code>在赋予它们该值的方法之外,而 <code>NSString</code>s 以任何其他方式赋予值。</p>

<p>我发现这个问题完全无法搜索,因此感谢您抽出宝贵时间。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>相关答案:<a href="https://stackoverflow.com/a/8032400/1574177" rel="noreferrer noopener nofollow">Difference between NSString literals</a> </p>

<p>简而言之,在程序的全局范围内编写 <code>@""</code> 时,其作用与编写 <code>""</code> 相同:将嵌入您指定的文字字符串在编译时在您的二进制文件中,因此不能在运行时释放。这就是您不需要<code>release</code> 或<code>retain</code> 的原因。
<code>@</code> 只是告诉编译器从 C 字符串文字构造一个 NSString 对象。请注意,这种结构非常便宜,并且可能进行了大量优化。您可以点击链接查看此示例:</p>

<pre><code>NSString *str = @&#34;My String&#34;;
NSLog(@&#34;%@ (%p)&#34;, str, str);

NSString *str2 = [ initWithString:@&#34;My String&#34;];
NSLog(@&#34;%@ (%p)&#34;, str2, str2);
</code></pre>

<p>产生这个输出:</p>

<pre><code>2011-11-07 07:11:26.172 Craplet My String (0x100002268)
2011-11-07 07:11:26.174 Craplet My String (0x100002268)
</code></pre>

<p>注意相同的内存地址</p>

<p>编辑:
我自己做了一些测试,看这段代码:</p>

<pre><code>static NSString *str0 = @&#34;My String&#34;;

int main(int argc, const char * argv[]) {
    NSLog(@&#34;%@ (%p)&#34;, str0, str0);

    NSString *str = @&#34;My String&#34;;
    NSLog(@&#34;%@ (%p)&#34;, str, str);

    NSString *str2 = [ initWithString:@&#34;My String&#34;];
    NSLog(@&#34;%@ (%p)&#34;, str2, str2);

    return 0;
}
</code></pre>

<p>将产生这个输出:</p>

<pre><code>2015-12-13 21:20:00.771 Test My String (0x100001030)
2015-12-13 21:20:00.772 Test My String (0x100001030)
2015-12-13 21:20:00.772 Test My String (0x100001030)
</code></pre>

<p>此外,在使用调试器时,您可以看到使用文字时创建的实际对象实际上是 <code>__NSCFConstantString</code> 对象。
我认为与此相关的概念称为 <a href="https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/ClassClusters/ClassClusters.html" rel="noreferrer noopener nofollow">Class Clusters</a> </p>

<p> <a href="/image/sVrXG.png" rel="noreferrer noopener nofollow"><img src="/image/sVrXG.png" alt="enter image description here"/></a> </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - @&#34;&#34;在幕后究竟做了什么?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/34255645/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/34255645/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - @&#34;&#34;在幕后究竟做了什么?