“`”

ios5之前是MRC,内存需要程序员进行管理,ios5之后是ARC,除非特殊情况,比如C框架或者循环引用,其他时候是不需要程序员手动管理内存的。
ios中当我们定义属性@property的时候就需要属性修饰符,下面我们就看一下不同属性修饰符的作用。有错误和不足的地方还请大家谅解并批评指正。

主要的属性修饰符有下面几种:

<ul>
<li>copy</li>
<li>assign</li>
<li>retain</li>
<li>strong</li>
<li>weak</li>
<li>readwrite/readonly (读写策略、访问权限)</li>
<li>nonatomic/atomic (安全策略)</li>
</ul>

如果以MRC和ARC进行区分修饰符使用情况,可以按照如下方式进行分组:

 

<pre><code class=""language-objectivec"" lang=""objectivec""> 1. MRC: assign/ retain/ copy/ readwrite、readonly/ nonatomic、atomic 等。
2. ARC: assign/ strong/ weak/ copy/ readwrite、readonly/ nonatomic、atomic 等。
</code></pre>

属性修饰符对retainCount计数的影响。

<ol start="""">
<li>alloc为对象分配内存,retainCount 为1 。</li>
<li>retain MRC下 retainCount + 1。</li>
<li>copy 一个对象变成新的对象,retainCount为 1, 原有的对象计数不变。</li>
<li>release 对象的引用计数 -1。</li>
<li>autorelease 对象的引用计数 retainCount – 1,如果为0,等到最近一个pool结束时释放。</li>
</ol>

不管MRC还是ARC,其实都是看reference count是否为0,如果为0那么该对象就被释放,不同的地方是MRC需要程序员自己主动去添加retain 和 release,而ARC apple已经给大家做好,自动的在合适的地方插入retain 和 release类似的内存管理代码,具体原理如下,图片摘自官方文档。

<img alt=""img"" referrerpolicy=""no-referrer"" src=""https:////upload-images.jianshu.io/upload_images/3691932-2755b62e1b3700d0.png?imageMogr2/auto-orient/strip|imageView2/2/w/691/format/webp"">

MRC 和 ARC原理

下面就详述上所列的几种属性修饰符的使用场景,应用举例和注意事项。

 

<pre><code> "“`

Was this helpful?

0 / 0

发表回复 0

Your email address will not be published.