本篇源于对一个监听键盘通知的处理。
监听键盘高度代码十分简单:
// 添加监听
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardChange:)
name:UIKeyboardWillChangeFrameNotification object:nil];
// 处理事件
- (void)keyboardChange:(NSNotification*)notifiction{
CGFloat during = [notifiction.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue];
CGRect begin = [notifiction.userInfo[UIKeyboardFrameBeginUserInfoKey] CGRectValue];
CGRect end = [notifiction.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGFloat diff = end.origin.y - begin.origin.y;
if (diff == 0)
return;
}
else if (diff < 0) {
// 上升 键盘的高度包含了安全区高度
// code...
} else {
// 下降
// code...
}
}
问题是:是否需要销毁监听?
看到的很多帖子都写了[[NSNotificationCenter defaultCenter] removeObserver:self];
这样的代码。
然而,我们看文档里的说法:

意思就是iOS 9.0 往后,这样的方式不用主动去取消监听,系统会自动清除这个监听者在下次发出这个通知的时候。猜想,这里系统对observer采用了弱引用的方式,当前的viewcontroller 销毁后,系统保存的observe就变成了nil,这样,先去判断是否是nil,如果是nil就移除即可。
这里不是想说代码应该怎样去写,而是引出者如何查文档的问题,因为笔者发现一个问题:
很多开发者竟然认为注释就是文档。比如我们进入系统的这个类,看到如下内容,然后就认为这个类没什么文档,只有最下面绿色的那两行说明。

当光标放到方法的最后时,注意光标的位置(左边箭头),真正的文档在右边就会显示:

右边红框中的内容才是真正的文档。可以看到有很多文字性的说明,这才是我们需要去看的地方。点击右下角的Open in Developer Documentation
可以打开独立的文档窗口,可以更方便的查看。
一、查看文档:
1.在线文档
1.1>旧版在线文档:文档地址
虽然苹果明确说明了该文档已经过期,但左侧的结构更方便查找,往往结合新版的使用,作为查找的备选方案。

1.2>新版在线文档:文档地址
2.本地文档
打开Xcode,按Command + shift + 0 ,即可看到本地文档。

二、如何使用文档
三、如何保持进步
正如本文一开始的遇到的问题一样,开发中经常会这样的小问题,通常会选择简单的百度一下去解决,而忽略了文档(有时候文档也写的不清晰,这就需要仔细去写代码测试辨别),就跟着别人的帖子写了很多不必要的代码,甚至是错误的代码。
仔细想想,这其实是一个开发者不探索代码原理的必然结果:
只要别人的代码有用,拷贝过来改改就行了,中间有什么问题等出了再说。而不去探究别人代码的逻辑、思路。长此以往,水平就被固化了,也难有进步。
如何保持进步?答案也很简单: 保持好奇心并持续探索。遇到疑问就去查,去探究,去分析,去追根问底。
要做到这些并不容易,需要毅力和耐心,以及长时间的积累。
有时候我们会感觉到自己基础不好,然而又说不上来哪里不好,往往就是这一步做的不够。
在经过上述一段时间的沉淀后,就会对系统级别的API就有了理解,对原理也清楚了许多。写代码也更有底气,甚至有点随心所欲起来。注意,到这里其实已经有了很大的成长,也为后续拓宽打下了基础(原理往往都是类似的)。
再往后就会有对写法、结构的疑问,这时往往就摸到了设计模式的边缘,去研究不同的设计模式,去理解,去设计,去比较,在设计模式上去沉淀。
再往后就需要去尝试其他的技术栈,比如 js、node、java、c++等, 去感受其他语言的设计。通过学习其他技术栈提升自己的对原有技术栈的理解。有人肯定觉得奇怪,我的回答是不要怀疑,做就是了,很快你就会理解这一点。
再往后,笔者还没达到那样的高度。可以隐约感受到的是去学习大量优秀开源库、开源框架的源码,在架构上去沉淀。
以上就是笔者自己学习的一个过程,体会最深的就是一个东西不管多难多复杂都不要紧,一定要有持续探究的勇气和耐心。
笔者曾经写过一段时间的Vue,学习的方法就是上面这样,一步一步从教程和文档中沉淀,很快就发现和公司中其他原本写前端的人写出的代码的差异。明显可以看出自己的代码更加”官方“,而其他人的野路子就很多。不是说野路子不好,有些问题的确需要一些野路子去处理。 但是,往往这些遇到的问题都是早已有了解决方法。基础的东西就像是公式,业务的东西就像是做题。当公式灵活掌握后,业务这些东西早已不是问题。
以上便是笔者的一点点心得,记录了从遇到问题到反思的过程,希望可以给读者带来一点点启发。
网友评论