写在使用 Linux 工作一年后
Oct 25 2018
Uncategorized

start

去年公司空了几台台式机,当时看了下似乎配置比我用的乞丐版 air 略高一些,而且除了 ssd 以外还有一个 1T 的大硬盘,加上后面可能会有一段时间不做 iOS 了,那就不需要 macOS 了,于是顺了一台过来桌上用来打算做开发机,当时可选的方案有 Windows 10 和 Linux,思考了下机器上 60G 的 ssd 估计是不能装那么多东西的,而 Windows 要把好多东西装到 D 盘,其实用起来好麻烦,感觉自己不太会用,于是选择了 Linux

本文写在我使用 Linux 作为开发环境后的三个月,也就是主力开发环境为纯 Linux 环境,偶尔使用虚拟机做配合,Linux 是天生为喜欢折腾的人准备的,当然也是为了知道自己想要做什么和想要什么的人准备的,所以本文的目的是为了以 Linux 作为生产开发环境为目标的人准备的,如果只有想要装个 Linux 的想法,或者只有想要试试玩玩的想法,个人建议使用自己熟悉的环境(Windows 或者 macOS)搭配虚拟机从完整配置一个 ArchLinux 开始学习

本文主要是为了将要以 Linux 作为自己主力开发环境的同学准备的一些意见建议,以及自己的踩坑经历,如果你想要以 Linux 作为主力开发环境可以把本文作为开始,但是本文绝对不是结束,linux 的折腾是无止境的

理解 iOS 和 macOS 的内存管理
Oct 8 2018
Uncategorized

在 iOS 和 macOS 应用的开发中,无论是使用 Objective-C 还是使用 swift 都是通过引用计数策略来进行内存管理的,但是在日常开发中80%(这里,我瞎说的,8020 原则嘛😆)以上的情况,我们不需要考虑内存问题,因为 Objective-C 2.0 引入的自动引用计数(ARC)技术为开发者们自动的完成了内存管理这项工作。ARC 的出现,在一定程度上拯救了当时刚入门的 iOS 程序员们,如果是没有接触过内存管理的开发者,在第一次遇到僵尸对象时一定是吓得发抖😱😱😱My Brains~。但是 ARC 只是在代码层面上自动添加了内存管理的代码,并不能真正的自动内存管理,以及一些高内存消耗的特殊场景我们必须要进行手动内存管理,所以理解内存管理是每一个 iOS 或者 macOS 应用开发者的必备能力。

本文将会介绍 iOS 和 macOS 应用开发过程中,如何进行内存管理,以及介绍一些内存管理使用的场景,帮助大家解决内存方面的问题,本文将会重点介绍内存管理的逻辑、思路,而不是类似教你分分钟手写 weak 的实现,之类的问题,毕竟大家一般拧螺丝比较多,至于✈️🚀🛸的制造技艺嘛,还是要靠万能的 Google 了。

本文其实是内存管理的起点,而不是结束,各位 iOS 大佬们肯定会发现很多东西在本文中是找不到的,因为这里的内容非常基础,只是帮助初学 iOS 的同学们能够快速理解如何管理内存而写的。

Effective Objective-C 2.0 Tips 总结 Chapter 5,6,7
Oct 7 2018
Uncategorized

Effective Objective-C 2.0 Tips 总结 Chapter 5,6,7

Chapter 5 内存管理

  • Tips 29 理解引用计数
    • 引用计数是 Objective-C 内存管理的基础,包括 ARC 也是建立在引用计数的基础之上,理解引用计数机制,能更好的帮你使用 ARC
    • 引用计数的基本原理是每个对象都有一个当前有多少对象希望他存活的计数器,当这个计数器归零那么这个对象就会被释放
    • 查看引用计数的方法叫做 retainCount 但是实际并不建议使用这个方法调试代码
    • 如果对象 A 需要对象 B 存活,那么 A 需要调用 B 的 retain 方法,如果对象 A 不再需要对象 B 存活了,那么需要调用对象 B 的 release 方法或者 autorelease 方法
    • 调用 release 并不会使对象被释放,对象释放被释放取决于引用计数是否为 0
    • 所有的对象最终都间接或直接的被一个根对象所引用,macOS 应用是 NSApplication 对象,iOS 则是 UIApplication 对象,这两个对象都是应用启动时创建的单例
    • 对象的 alloc 方法返回的对象由调用者持有
    • autorelease 并不会马上减少对象的引用计数,而是在下一次 Event Loop(事件循环)时减少,以达到延迟释放对象的效果
    • autorelease 通常用在函数返回对象的情况,保证对象跨越函数调用边界
Effective Objective-C 2.0 Tips 总结 Chapter 3 & Chapter 4
Jul 21 2017
Uncategorized

Effective Objective-C 2.0 Tips 总结 Chapter 3 & Chapter 4

Chapter 3 接口与 API 设计

  • Tips 15 使用前缀避免明明空间冲突

    • Objective-C 没有命名空间,所以我们在起名时要设法避免命名冲突
    • 避免命名冲突的方法就是使用前缀
    • 应用中的所有名称都需要加前缀(包括实现文件中的全局变量和纯 C 函数)
  • Tips 16 提供“全能(designated)初始化方法”

    • 一个会被所有初始化方法调用到的初始化方法
    • 当底层数据存储机制变化时,只需要修改这个方法就可以了,不需要改动其他初始化方法
    • 如果超类的全能初始化方法不适用于子类,或是与超类不同,那么需要覆盖这个超类方法
    • 子类的全能初始化方法都应该调用超类的对应方法,逐级向上
征服恐惧!用 Vim 写 iOS App
Feb 20 2017
Uncategorized

我们都知道 Vim 和 Emacs 都是文本编辑器中的上古神器,你也许用 ctags,cscopes 配合 Vim 完成过大型 C 或者 C++ 的开发,你也许配合过其他插件,完成过 JavaScript,python 代码的开发,但是很少有人试过 iOS app 的开发吧,毕竟 iOS 的框架包含了很多东西,以及 Objective-C 天生很长的 API 名字,让我们没办法把此神器用起来,今天我就来给大家讲下我是怎么使用 Vim 开发 iOS App 的,当然 Emacs 也可以

begin

使用 Vim 开发 iOS App 并不是特殊的爱好,而是被 Xcode 8 活生生的逼的,刚开始更新了 Xcode 8 以后,Xcode 8 把第三方插件给屏蔽了,导致没有 XVim 给我用了,没有 XVim 以后,发现异常不顺手,于是尝试用了一段时间的 AppCode,不得不说 AppCode 是一个非常好的 IDE,但是他有个很大的缺点,那就是 Java,JetBrain 家的东西都很不错,唯一缺点就是基于 Java,整个平台都略慢,然后我在不断的 google 过程中,发现了有人竟不知何谓恐惧,竟然使用 Vim 开发 iOS App,最后我也学会了这个新姿势 XDDDD

不过目前,只支持 Objective-C 代码的开发,swift 的话,没有解决工程文件自动补全的问题,因为目前大家使用的流行的 swift 自动补全工具 SourceKitten 并没有支持 workspace 所以暂时还没用起来

以及,目前不支持调试,因为发现 Vim 对调试的支持确实好糟糕…

Effective Objective-C 2.0 Tips 总结 Chapter 1 & Chapter 2
Nov 28 2016
Uncategorized

Effective Objective-C 2.0 Tips 总结 Chapter 1 & Chapter 2

下面只是对读到的所有 Tips 结合我平时开发中遇到的问题进行总结,每一个 Tips 和书中的每一条对应,本文的目的是去掉书中的大部分讨论的内容,让人能够马上使用这些 Tips,建议阅读过原书后食用更佳。

Chapter 1 熟悉 Objective-C

  • Tips 1 Objective-C 的起源

    • Objective-C 是从 C 语言演化而来,有 C 的一些基础会有很大帮助
  • Tips 2 头文件中减少引用

    • 减少在类的头文件中 import 其他头文件,如果使用其他类,那么使用@class ClassName;来进行Forward Declaring
    • 对于协议,每个协议放到对应的头文件,使用时候引用
    • 对于委托协议(比如 UITableViewUITableViewDelegate)因为只有与委托类放在一起才有意义,所以就不用单独分离头文件,应该放到定义 UITableView 的头文件中
在 Cent OS 7 上搭建带着 PHP 7 和 Memcached 的 LAMP
Jul 23 2016
Uncategorized

start

最近公司增加了一台测试用的服务器,当然因为只是测试用,所以决定所有东西都装到一个服务器上,用来我们自己撸代码,发测试版功能,做点小实验神码的,等等等等……反正就是方便用吧,所以自己来试了下搭建一台完全的 LAMP 开发\测试环境,当然同样踩到了无数的坑

那我们来开始吧

Step.1 先搞个服务器

那第一步,我们先搞个服务器吧,搞啥服务器呢,既然是测试用那就搞点不要钱的,或者方便的吧,这里就推荐大家试试用 AWS 或者自己机器上搭建虚拟机,比如 Vagrant 这样的开发平台也是可以的,这里,我们就用 AWS 了,反正可以免费一年,AWS 的优点是访问国外网站超快,缺点自然是国内访问超慢,当然大家用啥都可以的啦,这里假设我们已经有一台 Cent OS 7 的服务器了,并且假设你可以远程链接到这台服务器(比如 ssh)

iOS Autolayout 介绍 2 Interface Builder 技巧
Jul 8 2016
Uncategorized

start

上一期,介绍了一下 Autolayout 的一些基本做法,以及 iOS 上 AutoLayout 的思想和简单的原理介绍,有同学给我建议继续出下一期,这里,我们就来继续第二期吧,这一期我们依然停留在 Interface Builder(后面简写 IB)上,介绍我在工作中遇到的一些问题,以及依赖 IB 是如何解决的,也不会涉及很多代码。

小技巧篇

预览功能

有时候,我们在拖拽完成布局后,总想看看效果怎么办呢?IB 给我们提供了预览功能,在 Assistant 编辑器中文件选择 preview 就可以看到 IB 布局后界面的预览效果了,而且可以添加多个设备,以及添加横屏和竖屏的效果。

选择预览

POP Animation 和 layoutSubviews 的冲突
Jun 25 2016
Uncategorized

问题现象

因为 Facebook 的 POP 框架用起来很舒服,于是一直慢慢来习惯了用 POP 做动画,最近做了一个很简单的让一个 Button 旋转的动画,程序却异常的崩溃了,崩溃的地方在 -layoutSubviews 这个地方,如下图目测,应该是因为动画的时候,触发了 -layoutSubviews 方法,于是崩溃,就像这样

Crash

并且在终端输出了这样的信息

1
2
Jun 27 07:05:17  shenzhenren[5868] <Error>: CGAffineTransformInvert: singular matrix.
Jun 27 07:05:17 shenzhenren[5868] <Error>: CGAffineTransformInvert: singular matrix.
iOS Autolayout 介绍
Jun 4 2016
Uncategorized

简介

曾经 iPhone 和 iPad 的屏幕的逻辑分辨率只有唯一的一个大小,所以在 iOS 上开发应用是非常幸福的,我们不需要面对大量的屏幕尺寸和分辨率,但是随着 iPhone5,6,6 plus,iPad Pro 的出现,以及 iOS 上提供的分屏多任务的支持,应对不同分辨率的布局在现在 iOS 开发中已经变的非常重要,在 iOS 上常用的布局方式有下面几种:

  • 代码布局,在 - layoutSubview 的时候调整每个元素的位置、大小实现 UI 的布局
  • UIViewAutoresizing 通过设置一系列的开关决定每个 view 在父 view 发生变化时如何处理,这种方式一般会和代码布局的方式相配和完成比较复杂的 UI 布局
  • Autolayout,也是今天的主角,通过设置元素之间的关系来决定每个 view 的位置

布局解决的是什么问题

Autolayout 要解决的问题是布局的问题,也就是 UI 上面每个元素的位置问题,在使用代码布局的时代我们在 - viewDidLoad 方法中设置每个元素的初始位置,在 - layoutSubviews 方法中,解决父 view 发生变化时界面上各个元素应该如何再次布局的问题,同时方便我们会配合 UIViewAutoresizing 的开关来简化部分代码。

布局,要解决的问题就是 UI 上每个元素应该如何放置,他们的大小,以及绝对的位置在哪里,并且在 UI 发生变化,屏幕发生变化时,应如何应对。不论是通过代码布局,还是通过 Autolayout 布局,我们要做的都是告诉系统,每个元素在哪里,以及元素的宽和高。

Autolayout 和代码布局的区别是,Autolayout 通过告诉布局引擎每个元素之间的相对位置(也就是元素之间的关系)让布局引擎推断出每个元素的绝对位置和元素大小并告诉系统如何显示,代码布局则是每次直接告诉系统每个元素的绝对位置和大小。