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

内存拷贝渲染视频的研究
Jun 2 2016
Uncategorized

内存拷贝渲染视频

这里说的视频渲染是指通过 CVPixelBufferRef 获取 CGImageRef 对象在 UI 上进行渲染的过程。

大家都知道视频渲染是一个非常麻烦的过程,一般来说我们会通过将 CVPixelBufferRef 转换为 CIImage 再将 CIImage 对象转换为 CGImageRef 来完成视频的渲染,其中 CIImage 渲染到 CGImageRef 的过程将会需要到 CIContext- render:toBitmap:rowBytes:bounds:format:colorSpace: 方法来实现,但是在实际使用过程中发现,在 iOS 9.0 系统上,使用这个方法渲染视频时会出现内存泄漏的问题(长时间调试发现似乎是系统的问题)于是花了很多时间来找寻如何绕过 CIContext 来进行视频渲染,最终找到了直接内存拷贝进行视频渲染的方法,也是最为快速的方法。

iOS
对切图标注的思考
Aug 15 2015
Uncategorized

start

为什么写这个呢,在开发了一段时间的客户端以后,发现在还原设计稿的时候,收到的标注搞总是无法传达出设计师的心意,总需要自己再去丈量设计师给的设计图,另外前段时间,知乎专栏上这篇文章似乎略火做一份让工程师泪流满面的标注,当时看了看,觉得很不错啊,然后发给我司设计师大人们看了,我司设计师跟我说,nonono,工作量略大,我在仔细看看了后觉得确实,一个设计稿需要做三个标注,那是多蛋疼的事情啊-,-但是作为一个不断上进的码农,于是在开发之余不断的思考,决定写个文章告诉设计师,我是怎么想的,按照我的想法来标注-,-目的是从根本上解决这个问题。。。。。。

那么我们的目的就是:

  • 把我们怎么用代码画界面,告诉设计师们
  • 减少设计师和攻城狮之间无必要的交流
  • 帮助设计师们用最少的成本做出让码农们泪流满面的标注稿
ReactiveCocoa 模式 —— RACScheduler
Feb 18 2015
Uncategorized
No Post Excerpt