-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
515 lines (376 loc) · 25.3 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
<!DOCTYPE html>
<html>
<!-- Html Head Tag-->
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<meta name="author" content="noark9">
<!-- Open Graph Data -->
<meta property="og:title" content="noark9 的开发小笔记"/>
<meta property="og:description" content="" />
<meta property="og:site_name" content="noark9 的开发小笔记"/>
<meta property="og:type" content="website" />
<meta property="og:image" content="https://blog.noark9.com"/>
<link rel="alternate" href="/atom.xml" title="noark9 的开发小笔记" type="application/atom+xml">
<link rel="icon" href="/favicon.png">
<!-- Site Title -->
<title>noark9 的开发小笔记</title>
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="/css/bootstrap.min.css">
<!-- Custom CSS -->
<link rel="stylesheet" href="/css/style.dark.css">
<!-- Google Analytics -->
</head>
<body>
<!-- Page Header -->
<header class="site-header header-background" style="background-image: url(/img/default-banner-dark.jpg)">
<div class="container">
<div class="row">
<div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
<div class="page-title with-background-image">
<p class="title">noark9 的开发小笔记</p>
<p class="subtitle"></p>
</div>
<div class="site-menu with-background-image">
<ul>
<li>
<a href="/">
Home
</a>
</li>
<li>
<a href="/archives">
Archives
</a>
</li>
<li>
<a href="https://github.com/noark9">
Github
</a>
</li>
<li>
<a href="mailto:[email protected]">
Email
</a>
</li>
</ul>
</div>
</div>
</div>
</div>
</header>
<!-- Home Page Post List -->
<div class="container">
<div class="row">
<div class="col-lg-10 col-md-10 col-md-offset-1">
<div class="post-item-wrapper">
<a href="/2018/10/25/working-with-linux/" class="post-title">
写在使用 Linux 工作一年后
</a>
<div class="post-excerpt">
<!-- Post Date and Categories -->
<div class="date-and-category">
<div class="date">Oct 25 2018</div>
<div class="categories">
Uncategorized
</div>
</div>
<!-- Post Excerpt -->
<div class="excerpt typo"><h1 id="start"><a href="#start" class="headerlink" title="start"></a>start</h1><p>去年公司空了几台台式机,当时看了下似乎配置比我用的乞丐版 air 略高一些,而且除了 ssd 以外还有一个 1T 的大硬盘,加上后面可能会有一段时间不做 iOS 了,那就不需要 macOS 了,于是顺了一台过来桌上用来打算做开发机,当时可选的方案有 Windows 10 和 Linux,思考了下机器上 60G 的 ssd 估计是不能装那么多东西的,而 Windows 要把好多东西装到 D 盘,其实用起来好麻烦,感觉自己不太会用,于是选择了 Linux</p>
<p>本文写在我使用 Linux 作为开发环境后的三个月,也就是主力开发环境为纯 Linux 环境,偶尔使用虚拟机做配合,Linux 是天生为喜欢折腾的人准备的,当然也是为了知道自己想要做什么和想要什么的人准备的,所以本文的目的是为了以 Linux 作为生产开发环境为目标的人准备的,如果只有想要装个 Linux 的想法,或者只有想要试试玩玩的想法,个人建议使用自己熟悉的环境(Windows 或者 macOS)搭配虚拟机从完整配置一个 ArchLinux 开始学习</p>
<p>本文主要是为了将要以 Linux 作为自己主力开发环境的同学准备的一些意见建议,以及自己的踩坑经历,如果你想要以 Linux 作为主力开发环境可以把本文作为开始,但是本文绝对不是结束,linux 的折腾是无止境的</p></div>
<!-- Post Tags -->
<div class="tags">
<a class="tag" href="/tags/linux/">linux</a> <a class="tag" href="/tags/fedora/">fedora</a>
</div>
</div>
</div>
<div class="post-item-wrapper">
<a href="/2018/10/08/Objective-C-Memory-Management/" class="post-title">
理解 iOS 和 macOS 的内存管理
</a>
<div class="post-excerpt">
<!-- Post Date and Categories -->
<div class="date-and-category">
<div class="date">Oct 8 2018</div>
<div class="categories">
Uncategorized
</div>
</div>
<!-- Post Excerpt -->
<div class="excerpt typo"><p>在 iOS 和 macOS 应用的开发中,无论是使用 Objective-C 还是使用 swift 都是通过引用计数策略来进行内存管理的,但是在日常开发中80%(这里,我瞎说的,8020 原则嘛😆)以上的情况,我们不需要考虑内存问题,因为 Objective-C 2.0 引入的自动引用计数(ARC)技术为开发者们自动的完成了内存管理这项工作。ARC 的出现,在一定程度上拯救了当时刚入门的 iOS 程序员们,如果是没有接触过内存管理的开发者,在第一次遇到僵尸对象时一定是吓得发抖😱😱😱My Brains~。但是 ARC 只是在代码层面上自动添加了内存管理的代码,并不能真正的自动内存管理,以及一些高内存消耗的特殊场景我们必须要进行手动内存管理,所以理解内存管理是每一个 iOS 或者 macOS 应用开发者的必备能力。</p>
<p>本文将会介绍 iOS 和 macOS 应用开发过程中,如何进行内存管理,以及介绍一些内存管理使用的场景,帮助大家解决内存方面的问题,本文将会重点介绍内存管理的逻辑、思路,而不是类似教你分分钟手写 <code>weak</code> 的实现,之类的问题,毕竟大家一般拧螺丝比较多,至于✈️🚀🛸的制造技艺嘛,还是要靠万能的 Google 了。</p>
<p>本文其实是内存管理的起点,而不是结束,各位 iOS 大佬们肯定会发现很多东西在本文中是找不到的,因为这里的内容非常基础,只是帮助初学 iOS 的同学们能够快速理解如何管理内存而写的。</p></div>
<!-- Post Tags -->
<div class="tags">
<a class="tag" href="/tags/iOS/">iOS</a> <a class="tag" href="/tags/macOS/">macOS</a> <a class="tag" href="/tags/内存管理/">内存管理</a>
</div>
</div>
</div>
<div class="post-item-wrapper">
<a href="/2018/10/07/EffectiveObjectiveCNote3/" class="post-title">
Effective Objective-C 2.0 Tips 总结 Chapter 5,6,7
</a>
<div class="post-excerpt">
<!-- Post Date and Categories -->
<div class="date-and-category">
<div class="date">Oct 7 2018</div>
<div class="categories">
Uncategorized
</div>
</div>
<!-- Post Excerpt -->
<div class="excerpt typo"><h1 id="Effective-Objective-C-2-0-Tips-总结-Chapter-5,6,7"><a href="#Effective-Objective-C-2-0-Tips-总结-Chapter-5,6,7" class="headerlink" title="Effective Objective-C 2.0 Tips 总结 Chapter 5,6,7"></a>Effective Objective-C 2.0 Tips 总结 Chapter 5,6,7</h1><h2 id="Chapter-5-内存管理"><a href="#Chapter-5-内存管理" class="headerlink" title="Chapter 5 内存管理"></a>Chapter 5 内存管理</h2><ul>
<li>Tips 29 理解引用计数<ul>
<li>引用计数是 Objective-C 内存管理的基础,包括 ARC 也是建立在引用计数的基础之上,理解引用计数机制,能更好的帮你使用 ARC</li>
<li>引用计数的基本原理是每个对象都有一个当前有多少对象希望他存活的计数器,当这个计数器归零那么这个对象就会被释放</li>
<li>查看引用计数的方法叫做 <code>retainCount</code> 但是实际并不建议使用这个方法调试代码</li>
<li>如果对象 A 需要对象 B 存活,那么 A 需要调用 B 的 <code>retain</code> 方法,如果对象 A 不再需要对象 B 存活了,那么需要调用对象 B 的 <code>release</code> 方法或者 <code>autorelease</code> 方法</li>
<li>调用 <code>release</code> 并不会使对象被释放,对象释放被释放取决于引用计数是否为 0</li>
<li>所有的对象最终都间接或直接的被一个根对象所引用,macOS 应用是 <code>NSApplication</code> 对象,iOS 则是 <code>UIApplication</code> 对象,这两个对象都是应用启动时创建的单例</li>
<li>对象的 <code>alloc</code> 方法返回的对象由调用者持有</li>
<li><code>autorelease</code> 并不会马上减少对象的引用计数,而是在下一次 Event Loop(事件循环)时减少,以达到延迟释放对象的效果</li>
<li><code>autorelease</code> 通常用在函数返回对象的情况,保证对象跨越函数调用边界</li>
</ul>
</li>
</ul></div>
<!-- Post Tags -->
<div class="tags">
<a class="tag" href="/tags/iOS/">iOS</a> <a class="tag" href="/tags/Objective-C/">Objective-C</a> <a class="tag" href="/tags/Effective-Objective-C/">Effective Objective-C</a>
</div>
</div>
</div>
<div class="post-item-wrapper">
<a href="/2017/07/21/EffectiveObjectiveCNote2/" class="post-title">
Effective Objective-C 2.0 Tips 总结 Chapter 3 & Chapter 4
</a>
<div class="post-excerpt">
<!-- Post Date and Categories -->
<div class="date-and-category">
<div class="date">Jul 21 2017</div>
<div class="categories">
Uncategorized
</div>
</div>
<!-- Post Excerpt -->
<div class="excerpt typo"><h1 id="Effective-Objective-C-2-0-Tips-总结-Chapter-3-amp-Chapter-4"><a href="#Effective-Objective-C-2-0-Tips-总结-Chapter-3-amp-Chapter-4" class="headerlink" title="Effective Objective-C 2.0 Tips 总结 Chapter 3 & Chapter 4"></a>Effective Objective-C 2.0 Tips 总结 Chapter 3 & Chapter 4</h1><h2 id="Chapter-3-接口与-API-设计"><a href="#Chapter-3-接口与-API-设计" class="headerlink" title="Chapter 3 接口与 API 设计"></a>Chapter 3 接口与 API 设计</h2><ul>
<li><p>Tips 15 使用前缀避免明明空间冲突</p>
<ul>
<li>Objective-C 没有命名空间,所以我们在起名时要设法避免命名冲突</li>
<li>避免命名冲突的方法就是使用前缀</li>
<li>应用中的所有名称都需要加前缀(包括实现文件中的全局变量和纯 C 函数)</li>
</ul>
</li>
<li><p>Tips 16 提供“全能(designated)初始化方法”</p>
<ul>
<li>一个会被所有初始化方法调用到的初始化方法</li>
<li>当底层数据存储机制变化时,只需要修改这个方法就可以了,不需要改动其他初始化方法</li>
<li>如果超类的全能初始化方法不适用于子类,或是与超类不同,那么需要覆盖这个超类方法</li>
<li>子类的全能初始化方法都应该调用超类的对应方法,逐级向上</li>
</ul>
</li>
</ul></div>
<!-- Post Tags -->
<div class="tags">
<a class="tag" href="/tags/iOS/">iOS</a> <a class="tag" href="/tags/Objective-C/">Objective-C</a> <a class="tag" href="/tags/Effective-Objective-C/">Effective Objective-C</a>
</div>
</div>
</div>
<div class="post-item-wrapper">
<a href="/2017/02/20/Develop-iOS-App-with-VIM/" class="post-title">
征服恐惧!用 Vim 写 iOS App
</a>
<div class="post-excerpt">
<!-- Post Date and Categories -->
<div class="date-and-category">
<div class="date">Feb 20 2017</div>
<div class="categories">
Uncategorized
</div>
</div>
<!-- Post Excerpt -->
<div class="excerpt typo"><p>我们都知道 Vim 和 Emacs 都是文本编辑器中的上古神器,你也许用 ctags,cscopes 配合 Vim 完成过大型 C 或者 C++ 的开发,你也许配合过其他插件,完成过 JavaScript,python 代码的开发,但是很少有人试过 iOS app 的开发吧,毕竟 iOS 的框架包含了很多东西,以及 Objective-C 天生很长的 API 名字,让我们没办法把此神器用起来,今天我就来给大家讲下我是怎么使用 Vim 开发 iOS App 的,当然 Emacs 也可以</p>
<h1 id="begin"><a href="#begin" class="headerlink" title="begin"></a>begin</h1><p>使用 Vim 开发 iOS App 并不是特殊的爱好,而是被 Xcode 8 活生生的逼的,刚开始更新了 Xcode 8 以后,Xcode 8 把第三方插件给屏蔽了,导致没有 XVim 给我用了,没有 XVim 以后,发现异常不顺手,于是尝试用了一段时间的 AppCode,不得不说 AppCode 是一个非常好的 IDE,但是他有个很大的缺点,那就是 Java,JetBrain 家的东西都很不错,唯一缺点就是基于 Java,整个平台都略慢,然后我在不断的 google 过程中,发现了有人竟不知何谓恐惧,竟然使用 Vim 开发 iOS App,最后我也学会了这个新姿势 XDDDD</p>
<p>不过目前,只支持 Objective-C 代码的开发,swift 的话,没有解决工程文件自动补全的问题,因为目前大家使用的流行的 swift 自动补全工具 SourceKitten 并没有支持 workspace 所以暂时还没用起来</p>
<p>以及,目前不支持调试,因为发现 Vim 对调试的支持确实好糟糕…</p></div>
<!-- Post Tags -->
<div class="tags">
<a class="tag" href="/tags/iOS/">iOS</a> <a class="tag" href="/tags/vim/">vim</a>
</div>
</div>
</div>
<div class="post-item-wrapper">
<a href="/2016/11/28/EffectiveObjectiveCNote1/" class="post-title">
Effective Objective-C 2.0 Tips 总结 Chapter 1 & Chapter 2
</a>
<div class="post-excerpt">
<!-- Post Date and Categories -->
<div class="date-and-category">
<div class="date">Nov 28 2016</div>
<div class="categories">
Uncategorized
</div>
</div>
<!-- Post Excerpt -->
<div class="excerpt typo"><h1 id="Effective-Objective-C-2-0-Tips-总结-Chapter-1-amp-Chapter-2"><a href="#Effective-Objective-C-2-0-Tips-总结-Chapter-1-amp-Chapter-2" class="headerlink" title="Effective Objective-C 2.0 Tips 总结 Chapter 1 & Chapter 2"></a>Effective Objective-C 2.0 Tips 总结 Chapter 1 & Chapter 2</h1><p>下面只是对读到的所有 Tips 结合我平时开发中遇到的问题进行总结,每一个 Tips 和书中的每一条对应,本文的目的是去掉书中的大部分讨论的内容,让人能够马上使用这些 Tips,建议阅读过原书后食用更佳。</p>
<h2 id="Chapter-1-熟悉-Objective-C"><a href="#Chapter-1-熟悉-Objective-C" class="headerlink" title="Chapter 1 熟悉 Objective-C"></a>Chapter 1 熟悉 Objective-C</h2><ul>
<li><p>Tips 1 Objective-C 的起源</p>
<ul>
<li>Objective-C 是从 C 语言演化而来,有 C 的一些基础会有很大帮助</li>
</ul>
</li>
<li><p>Tips 2 头文件中减少引用</p>
<ul>
<li>减少在类的头文件中 import 其他头文件,如果使用其他类,那么使用<code>@class ClassName;</code>来进行<strong>Forward Declaring</strong></li>
<li>对于协议,每个协议放到对应的头文件,使用时候引用</li>
<li>对于委托协议(比如 <code>UITableView</code> 和 <code>UITableViewDelegate</code>)因为只有与委托类放在一起才有意义,所以就不用单独分离头文件,应该放到定义 <code>UITableView</code> 的头文件中</li>
</ul>
</li>
</ul></div>
<!-- Post Tags -->
<div class="tags">
<a class="tag" href="/tags/iOS/">iOS</a> <a class="tag" href="/tags/Objective-C/">Objective-C</a> <a class="tag" href="/tags/Effective-Objective-C/">Effective Objective-C</a>
</div>
</div>
</div>
<div class="post-item-wrapper">
<a href="/2016/07/23/LAMP-on-CentOS7/" class="post-title">
在 Cent OS 7 上搭建带着 PHP 7 和 Memcached 的 LAMP
</a>
<div class="post-excerpt">
<!-- Post Date and Categories -->
<div class="date-and-category">
<div class="date">Jul 23 2016</div>
<div class="categories">
Uncategorized
</div>
</div>
<!-- Post Excerpt -->
<div class="excerpt typo"><h1 id="start"><a href="#start" class="headerlink" title="start"></a>start</h1><p>最近公司增加了一台测试用的服务器,当然因为只是测试用,所以决定所有东西都装到一个服务器上,用来我们自己撸代码,发测试版功能,做点小实验神码的,等等等等……反正就是方便用吧,所以自己来试了下搭建一台完全的 LAMP 开发\测试环境,当然同样踩到了无数的坑</p>
<h1 id="那我们来开始吧"><a href="#那我们来开始吧" class="headerlink" title="那我们来开始吧"></a>那我们来开始吧</h1><h2 id="Step-1-先搞个服务器"><a href="#Step-1-先搞个服务器" class="headerlink" title="Step.1 先搞个服务器"></a>Step.1 先搞个服务器</h2><p>那第一步,我们先搞个服务器吧,搞啥服务器呢,既然是测试用那就搞点不要钱的,或者方便的吧,这里就推荐大家试试用 AWS 或者自己机器上搭建虚拟机,比如 Vagrant 这样的开发平台也是可以的,这里,我们就用 AWS 了,反正可以免费一年,AWS 的优点是访问国外网站超快,缺点自然是国内访问超慢,当然大家用啥都可以的啦,这里假设我们已经有一台 Cent OS 7 的服务器了,并且假设你可以远程链接到这台服务器(比如 ssh)</p></div>
<!-- Post Tags -->
<div class="tags">
<a class="tag" href="/tags/linux/">linux</a> <a class="tag" href="/tags/php/">php</a>
</div>
</div>
</div>
<div class="post-item-wrapper">
<a href="/2016/07/08/AutoLayout-2-IB-Tricks/" class="post-title">
iOS Autolayout 介绍 2 Interface Builder 技巧
</a>
<div class="post-excerpt">
<!-- Post Date and Categories -->
<div class="date-and-category">
<div class="date">Jul 8 2016</div>
<div class="categories">
Uncategorized
</div>
</div>
<!-- Post Excerpt -->
<div class="excerpt typo"><h1 id="start"><a href="#start" class="headerlink" title="start"></a>start</h1><p>上一期,介绍了一下 Autolayout 的一些基本做法,以及 iOS 上 AutoLayout 的思想和简单的原理介绍,有同学给我建议继续出下一期,这里,我们就来继续第二期吧,这一期我们依然停留在 Interface Builder(后面简写 IB)上,介绍我在工作中遇到的一些问题,以及依赖 IB 是如何解决的,也不会涉及很多代码。</p>
<h1 id="小技巧篇"><a href="#小技巧篇" class="headerlink" title="小技巧篇"></a>小技巧篇</h1><h2 id="预览功能"><a href="#预览功能" class="headerlink" title="预览功能"></a>预览功能</h2><p>有时候,我们在拖拽完成布局后,总想看看效果怎么办呢?IB 给我们提供了预览功能,在 Assistant 编辑器中文件选择 preview 就可以看到 IB 布局后界面的预览效果了,而且可以添加多个设备,以及添加横屏和竖屏的效果。</p>
<p><img src="/img/al2/al2.IB.preview.png" alt="选择预览"></p></div>
<!-- Post Tags -->
<div class="tags">
<a class="tag" href="/tags/iOS/">iOS</a> <a class="tag" href="/tags/AutoLayout/">AutoLayout</a>
</div>
</div>
</div>
<div class="post-item-wrapper">
<a href="/2016/06/25/layoutSubview-With-POP-Animation/" class="post-title">
POP Animation 和 layoutSubviews 的冲突
</a>
<div class="post-excerpt">
<!-- Post Date and Categories -->
<div class="date-and-category">
<div class="date">Jun 25 2016</div>
<div class="categories">
Uncategorized
</div>
</div>
<!-- Post Excerpt -->
<div class="excerpt typo"><h1 id="问题现象"><a href="#问题现象" class="headerlink" title="问题现象"></a>问题现象</h1><p>因为 Facebook 的 POP 框架用起来很舒服,于是一直慢慢来习惯了用 POP 做动画,最近做了一个很简单的让一个 Button 旋转的动画,程序却异常的崩溃了,崩溃的地方在 <code>-layoutSubviews</code> 这个地方,如下图目测,应该是因为动画的时候,触发了 <code>-layoutSubviews</code> 方法,于是崩溃,就像这样</p>
<p><img src="/img/layoutsubviews-pop-crash.png" alt="Crash"></p>
<p>并且在终端输出了这样的信息</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Jun 27 07:05:17 shenzhenren[5868] <Error>: CGAffineTransformInvert: singular matrix.</span><br><span class="line">Jun 27 07:05:17 shenzhenren[5868] <Error>: CGAffineTransformInvert: singular matrix.</span><br></pre></td></tr></table></figure></div>
<!-- Post Tags -->
<div class="tags">
<a class="tag" href="/tags/iOS/">iOS</a> <a class="tag" href="/tags/pop/">pop</a>
</div>
</div>
</div>
<div class="post-item-wrapper">
<a href="/2016/06/04/autolayout-1/" class="post-title">
iOS Autolayout 介绍
</a>
<div class="post-excerpt">
<!-- Post Date and Categories -->
<div class="date-and-category">
<div class="date">Jun 4 2016</div>
<div class="categories">
Uncategorized
</div>
</div>
<!-- Post Excerpt -->
<div class="excerpt typo"><h1 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h1><p>曾经 iPhone 和 iPad 的屏幕的逻辑分辨率只有唯一的一个大小,所以在 iOS 上开发应用是非常幸福的,我们不需要面对大量的屏幕尺寸和分辨率,但是随着 iPhone5,6,6 plus,iPad Pro 的出现,以及 iOS 上提供的分屏多任务的支持,应对不同分辨率的布局在现在 iOS 开发中已经变的非常重要,在 iOS 上常用的布局方式有下面几种:</p>
<ul>
<li>代码布局,在 <code>- layoutSubview</code> 的时候调整每个元素的位置、大小实现 UI 的布局</li>
<li><code>UIViewAutoresizing</code> 通过设置一系列的开关决定每个 view 在父 view 发生变化时如何处理,这种方式一般会和代码布局的方式相配和完成比较复杂的 UI 布局</li>
<li>Autolayout,也是今天的主角,通过设置元素之间的关系来决定每个 view 的位置</li>
</ul>
<h1 id="布局解决的是什么问题"><a href="#布局解决的是什么问题" class="headerlink" title="布局解决的是什么问题"></a>布局解决的是什么问题</h1><p>Autolayout 要解决的问题是布局的问题,也就是 UI 上面每个元素的位置问题,在使用代码布局的时代我们在 <code>- viewDidLoad</code> 方法中设置每个元素的初始位置,在 <code>- layoutSubviews</code> 方法中,解决父 view 发生变化时界面上各个元素应该如何再次布局的问题,同时方便我们会配合 <code>UIViewAutoresizing</code> 的开关来简化部分代码。</p>
<p>布局,要解决的问题就是 UI 上每个元素应该如何放置,他们的大小,以及绝对的位置在哪里,并且在 UI 发生变化,屏幕发生变化时,应如何应对。不论是通过代码布局,还是通过 Autolayout 布局,我们要做的都是告诉系统,每个元素在哪里,以及元素的宽和高。</p>
<p>Autolayout 和代码布局的区别是,Autolayout 通过告诉布局引擎每个元素之间的相对位置(也就是元素之间的关系)让布局引擎推断出每个元素的绝对位置和元素大小并告诉系统如何显示,代码布局则是每次直接告诉系统每个元素的绝对位置和大小。</p></div>
<!-- Post Tags -->
<div class="tags">
<a class="tag" href="/tags/iOS/">iOS</a> <a class="tag" href="/tags/AutoLayout/">AutoLayout</a>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Pagination -->
<div class="container">
<div class="row">
<div class="col-lg-10 col-md-10 col-md-offset-1">
<ul class="pagination">
<li class="next">
<a href="/page/2/">
<span>下一页</span>
<span class="symbol-right">></span>
</a>
</li>
</ul>
</div>
</div>
</div>
<!-- Footer -->
<footer>
<div class="container">
<div class="row">
<div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
<p class="copyright text-muted">
Theme By <a target="_blank" href="https://github.com/levblanc">Levblanc.</a>
Inspired By <a target="_blank" href="https://github.com/klugjo/hexo-theme-clean-blog">Clean Blog.</a>
<p class="copyright text-muted">
Powered By <a target="_blank" href="https://hexo.io/">Hexo.</a>
</p>
</div>
</div>
</div>
</footer>
<!-- After Footer Scripts -->
<script src="/js/highlight.pack.js"></script>
<script>
document.addEventListener("DOMContentLoaded", function(event) {
var codeBlocks = Array.prototype.slice.call(document.getElementsByTagName('pre'))
codeBlocks.forEach(function(block, index) {
hljs.highlightBlock(block);
});
});
</script>
</body>
</html>