iOS 开发-懒加载
<p>援引:https://www.jianshu.com/p/3287b13c90fb</p><div>
<div class="article">
<div class="show-content" data-note-content="">
<div class="show-content-free">
<h4>懒加载</h4>
<p>我们知道iOS设备的内存有限,如果程序在启动后就一次性加载将来会用到的所有资源,那么将有可能会耗尽iOS设备的内存。这些资源例如大量数据、图片、音频等等</p>
<p><strong>懒加载</strong>:也称<strong>延迟加载</strong>,说的通俗一点,就是在开发中,当程序中需要利用的资源时。在程序启动的时候不加载资源,只有在运行当中需要一些资源时,再去加载这些资源,即在需要的时候才加载(效率低,占用内存小),所谓懒加载,写的是其<code>get</code>方法。</p>
<p>提醒:这是苹果公司提倡的做法,其实苹果公司做的iOS系统中很多地方都用到了懒加载的方式,比如控制器的view的创建</p>
<p>注意:如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再去进行实例化</p>
<h4>懒加载的好处:</h4>
<ol>
<li>不必将创建的代码全部写在<code>viewDidLoad</code>方法中,代码的可读性更强</li>
<li>每个属性的<code>getter</code>方法中分别负责各自的实例化方法,代码彼此之间的独立性强,松耦合</li>
<li>只有当真正需要资源时,再去加载,节省了内存资源</li>
</ol>
<h4>代码示例:</h4>
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">定义控件属性,属性必须是strong的
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建一个可变数组</span>
@property (nonatomic, strong) NSMutableArray *<span style="color: rgba(0, 0, 0, 1)"> dataArray;
@property (nonatomic, strong) UILabel </span>*<span style="color: rgba(0, 0, 0, 1)"> title_lab;
重写这个属性对应的getter,将要实现的逻辑放在getter中
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">重写这个属性</span>
-(NSMutableArray *<span style="color: rgba(0, 0, 0, 1)">)dataArray
{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">判断字典是否已经存在,若没有,则进行实例化</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (_dataArray ==<span style="color: rgba(0, 0, 0, 1)"> nil) {
_dataArray </span>=<span style="color: rgba(0, 0, 0, 1)"> [init];
}
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> _dataArray;
}
</span>-(UILabel *<span style="color: rgba(0, 0, 0, 1)">)title_lab
{
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">_title_lab) {
self.title_lab </span>=<span style="color: rgba(0, 0, 0, 1)"> [init];
self.title_lab.textAlignment </span>=<span style="color: rgba(0, 0, 0, 1)"> NSTextAlignmentCenter;
self.title_lab.textColor </span>=<span style="color: rgba(0, 0, 0, 1)"> ;
self.title_lab.text </span>= <span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">lazyLoad</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
;
;
}
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> _title_lab;
}</span></pre>
</div>
<p> </p>
</li>
</ul>
<p><strong>注意一:指针循环引用问题</strong></p>
<pre class="hljs objectivec"><code class="objectivec"> <span class="hljs-keyword">if (_dataArray == <span class="hljs-literal">nil)不可以写成 <span class="hljs-keyword">if (<span class="hljs-keyword">self.dataArray == <span class="hljs-literal">nil) ,不然会造成循环引用指针
<span class="hljs-keyword">return _dataArray 不可以写成<span class="hljs-keyword">return <span class="hljs-keyword">self.dataArray 不然会形成循环引用
</span></span></span></span></span></span></span></span></code></pre>
<p><strong>注意二:关于布局的问题</strong></p>
<p>如果用<code>Masonry</code>布局页面的话,关于<code>frame</code>的代码一定不能放在重写的<code>get</code>方法里,不然会报<code>找不到父视图</code>的错误,要放在<code>addSubview</code>后面<br>报错:</p>
<pre class="hljs php"><code class="php">
<span class="hljs-number">2017<span class="hljs-number">-03<span class="hljs-number">-30 <span class="hljs-number">11:<span class="hljs-number">38:<span class="hljs-number">54.448 TestLazyLode[<span class="hljs-number">3885:<span class="hljs-number">93478] *** Terminating app due to uncaught <span class="hljs-keyword">exception <span class="hljs-string">'NSInternalInconsistencyException', reason: <span class="hljs-string">'couldn't find a common superview <span class="hljs-keyword">for <UILabel: <span class="hljs-number">0x7fed98709ba0; frame = (<span class="hljs-number">0 <span class="hljs-number">0; <span class="hljs-number">68.5 <span class="hljs-number">20.5); text = <span class="hljs-string">'lazyLoad'; userInteractionEnabled = NO; layer = <_UILabelLayer: <span class="hljs-number">0x60000009eaa0>> <span class="hljs-keyword">and <UIView: <span class="hljs-number">0x7fed98405860; frame = (<span class="hljs-number">0 <span class="hljs-number">0; <span class="hljs-number">375 <span class="hljs-number">667); autoresize = W+H; layer = <CALayer: <span class="hljs-number">0x60800002aee0>><span class="hljs-string">'
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>正确写法代码:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">ViewController.m
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">TestLazyLode
</span><span style="color: rgba(0, 128, 0, 1)">//</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Created by taobaichi on 2017/3/30.
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Copyright © 2017年 MaChao. All rights reserved.
</span><span style="color: rgba(0, 128, 0, 1)">//
</span>
<span style="color: rgba(0, 0, 255, 1)">#import</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ViewController.h</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">#import</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Masonry.h</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">@interface</span><span style="color: rgba(0, 0, 0, 1)"> ViewController ()
@property (nonatomic, strong) UILabel </span>*<span style="color: rgba(0, 0, 0, 1)"> title_lab;
</span><span style="color: rgba(0, 0, 255, 1)">@end</span>
<span style="color: rgba(0, 0, 255, 1)">@implementation</span><span style="color: rgba(0, 0, 0, 1)"> ViewController
</span>-(UILabel *<span style="color: rgba(0, 0, 0, 1)">)title_lab
{
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">_title_lab) {
self.title_lab </span>=<span style="color: rgba(0, 0, 0, 1)"> [init];
self.title_lab.textAlignment </span>=<span style="color: rgba(0, 0, 0, 1)"> NSTextAlignmentCenter;
self.title_lab.textColor </span>=<span style="color: rgba(0, 0, 0, 1)"> ;
self.title_lab.text </span>= <span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">lazyLoad</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
;
}
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> _title_lab;
}
</span>- (<span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)">)viewDidLoad {
;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Do any additional setup after loading the view, typically from a nib.
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">只是加载到预想加载的view上,不在初始化方法里为其alloc/init。只是一个指针,不会占内存</span>
<span style="color: rgba(0, 0, 0, 1)"> ;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Masonry布局设置必须写在addSubview:之后</span>
[self.title_lab mas_makeConstraints:^(MASConstraintMaker *<span style="color: rgba(0, 0, 0, 1)">make) {
make.centerX.equalTo(self.view.mas_centerX);
make.centerY.equalTo(self.view.mas_centerY);
make.size.mas_equalTo(CGSizeMake(</span><span style="color: rgba(128, 0, 128, 1)">100</span>, <span style="color: rgba(128, 0, 128, 1)">40</span><span style="color: rgba(0, 0, 0, 1)">));
}];
}
</span><span style="color: rgba(0, 0, 255, 1)">@end</span></pre>
</div>
<p> </p>
</div>
</div>
</div>
<div id="free-reward-panel" class="support-author"> </div>
</div><br><br>
来源:https://www.cnblogs.com/gaozhang12345/p/10818819.html
頁:
[1]