Swift Examples - Deinitialization
The Swift Programming Language Examples
源码在 GitHub:https://github.com/gewill/The-Swift-Programming-Language-2.1-Examples
Playground ->
1 | // : Playground - noun: a place where people can play |
The Swift Programming Language Examples
源码在 GitHub:https://github.com/gewill/The-Swift-Programming-Language-2.1-Examples
Playground ->
1 | // : Playground - noun: a place where people can play |
The Swift Programming Language Examples
源码在 GitHub:https://github.com/gewill/The-Swift-Programming-Language-2.1-Examples
Playground ->
1 | // : Playground - noun: a place where people can play |
The Swift Programming Language Examples
源码在 GitHub:https://github.com/gewill/The-Swift-Programming-Language-2.1-Examples
Playground ->
1 | // : Playground - noun: a place where people can play |
The Swift Programming Language Examples
源码在 GitHub:https://github.com/gewill/The-Swift-Programming-Language-2.1-Examples
写了一段时间的 Swift 后,又来恶补基础知识了。
Playground ->
1 | // : Playground - noun: a place where people can play |
使用代码自动布局,需求还是有的,虽然很习惯了 IB 来做。参看 Programming iOS 9。
一共三个方法:
感觉 anchor 一个折中的方案,语法比 constraints 简洁,符合 IB 设计和添加约束的思路。美中不足是仅支持 iOS 9。
The NSLayoutAnchor class is a factory class for creating NSLayoutConstraint objects using a fluent API. Use these constraints to programatically define your layout using Auto Layout.
具体的使用语法都很简单,贴一个书中的 Demo:
1 | let v1 = UIView(frame: CGRectMake(100, 111, 132, 194)) |
兼容 iOS 8 以下的,但是超级啰嗦。
1 |
|
这个语法支持 iOS 6,而且语法最为简洁直观。也是
Programming iOS 9 书中推荐的方案。实际项目尝试了上面两种两种方法后,想要更短的代码量的话,还是 Visual format notation 最为合适。这里也推荐大家,还很容易理解其语法,而且 console debugging 也会优先显示该语法。
1 | <NSLayoutConstraint:0x7f855ad1bb00 H:[UIButton:0x7f855ad1bba0'Button'(46@188)] priority:188> |
当然这些都是不用 IB 和 View Debugging / Reveal 情况下的选择。
还有个优点就是类 ASCII-art,可视化的样式描述。
The Visual Format Language lets you use ASCII-art like strings to define your constraints. This provides a visually descriptive representation of the constraints.
下面是一个 CustomToolBar 的 Demo:
1 | import UIKit |
经过几次项目的实践,发现还是 Visual Format 最好用,简洁直观。
在 Swift 大行其道,Objective-C 渐行渐远的今天,这本书看起来还是获益匪浅。按照52条方法目录摘录一些笔记。
Objective-C 为 C 语言添加了面向对象的特性,是其超集。Objective-C 使用动态绑定的消息结构,运行时才会检查对象的类型。接受一条消息后,究竟执行何种代码,由运行期环境而非编译器决定。
自动合成属性:@property
,指定实例变量名称:@synthesize
,属性特质:原子性/读写权限/读写方法名/内存管理,都做有详细的解释,就不在此赘述了。
直接访问实例变量:
例如:
1 | id returnValue = [someObject messageName: parameter]; |
someObject 叫做接受者(receiver),messageName 叫做选择子(selector),选择子和参数合起来称为消息(message)。编译器看到消息后将其转换为一条标准的 C 语言函数调用,所调用函数 objc_msgSend,原型如下:
1 | void objc_msgSend(id self, SEL cmd, ...) |
编译器会把消息转换为如下函数:
1 | id returnValue = objc_msgSend(someObject, |
objc_msgSend 函数会依据接受者与选择子的类型,来搜寻接受者所属的类中方法列表(list of methods ),找到就跳至实现代码。若找不到就沿着继承体系向上查找。最终找不到就执行消息转发(message forwarding)。
未完
几乎都是两个人的对话,从双方羞涩的看向对方,到因为一对德国夫妻吵架而对视。男主鼓起勇气就此打开话题,聊天聊地,就此很愉快的旅程开始了。不管现实生活和情感是否顺利,但是两人总有新的话题和趣闻。当 Jesse 邀请下车游玩时候故事才真正开始。
开始的找有趣的地方,到后来随意的逛街道,酒吧,看手相,看日落,餐厅里互打电话,晚上草地聊天,次日火车道别。两人不太想落入俗套的留电话地址的偶遇,固执的开始时声明不留电话。因此格外珍惜相遇的这一天,玩的尽兴,聊得深入心灵。酒吧里算是爱情观的吐槽:人总是寻求被爱的多一点。也都是害怕重新承受之前恋爱分手之痛。看手相部分引起了一些争执,Jesse 理性的戳穿手相师和填词诗人的把戏,Céline 的满足和感动都搅合了。餐厅里的打电话很有意思,感觉 Céline 的很多时候也是主动地吐露情愫。
最后火车送别明明很不舍,但双方还是很坚持之前的想法不把这次邂逅变成俗套的艳遇。不过最后也做了妥协,约定六个月后此地在相见,还因为从今天还是昨天算起而争执了一番。说明内心是多么的喜欢对方,却又害怕伤害的顾忌而妥协。
电影里面男女主角都是普通的人的性格特点和际遇,但因为相互吸引和聚到一起,一天虽短,但却异常有趣。或者这样的爱情很奢侈,但是或者这就是不讲婚姻时纯粹的爱情。
Auto Layout Guide: https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/index.html#//apple_ref/doc/uid/TP40010853-CH7-SW1
参考文章 iOS开发 - 处理不等高TableViewCell的小花招,实践出真知,也是费了一番力气才把文章 Cell 使用 Auto Layout自动算高。眼高手低总是有的,所以以后不仅要学习开发的思路方法论,重要是在实践一遍。
Auto Layout设置好高度约束。不要实现- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
1 | (void)viewDidLoad { |
1 | - (TableViewCell *)tableView:(UITableView *)tableView |
源码:https://github.com/gewill/test-projects/tree/master/test%20auto%20height%20cell
Swift中的内存指针讲解的很清楚:http://onevcat.com/2015/01/swift-pointer/。
Apple期望在Swift中指针能够尽量减少登场几率,因此在Swift中指针被映射为了一个泛型类型,并且还比较抽象。Swift中,指针都使用一个特殊的类型来表示,那就是UnsafePointer
还有苹果官方博客:Interacting with C Pointers。
下面代码是数组指针用法:
// Swift Memory UnsafePointer
var array = [1, 2, 3, 4, 5]
var arrayPtr = UnsafeMutableBufferPointer<Int>(start: &array, count: array.count)
// baseAddress 是第一个元素的指针
var basePtr = arrayPtr.baseAddress as UnsafeMutablePointer<Int>
print(basePtr.memory) // 1
basePtr.memory = 10
print(basePtr.memory) // 10
//下一个元素
var nextPtr = basePtr.successor()
print(nextPtr.memory) // 2
print(array) // [10, 2, 3, 4, 5]