深入理解 RunLoop

事件驱动模型

while (AppIsRunning) {
id whoWakesMe = SleepForWakingUp();
id event = GetEvent(whoWakesMe);
HandleEvent(event);
}

大部分的 GUI 程序都使用了事件驱动模型,有些服务器(nginx, node.js)也使用了事件驱动模型。相比于轮询等其他方式,其优点在于极大的提高了 CPU 使用率,在没有事件的时候,能够让出 CPU 时间片,来事件时也可以快速的得到响应。

Read More

一张图片引发的深思

在项目开发中使用 SDWebImage 来做图片缓存加载,但是遇到一个问题就是服务器的某一张图片始终无法加载出来,通过URL拿到原图之后可以正常查看。于是追根溯源定位到了 SDWebImage 中的 decodedImageWithImage 方法中,也给自己科普了一下图像处理的相关知识。

下面先了解图像的一些基础知识,然后分析遇到的问题。

Read More

使用xib加载View的小技巧

本人在开发中比较喜欢用 xib 来作布局,通常情况下,我们需要把一些常用的 view 封装成组件来供大伙儿使用。但是这个组件一般只是负责 view 层的展示任务,事件相关的业务逻辑需要转发到相应的 controller 里面去。这里介绍一下本人使用的一种方法。

直接上代码

Read More

APP安全性解析

翻看一下乌云上面关于 APP 的漏洞,发现有不少漏洞都是很弱智的错误,而且部分厂家还会选择主动忽略漏洞。按照近期公布的《第36次中国互联网络发展状况统计调查报告》显示,我国网民规模达6.68亿,其中手机网民规模达5.94亿,手机上网人群已超过台式机、笔记本等传统上网模式。如此规模的网民,安全问题却还没有获得足够的重视。

这一篇文章只是对 APP 中常见的安全问题做一个汇总概述,后续可能会单独拿出来一一详解。

Read More

Swift 构造过程

Swift 的构造过程算是比较复杂的,《The Swift Programming Language》 中关于 Initialization 的信息量也是非常大。

Swift 中构造器的写法如下

class Student: NSObject {
var name: String?
init(name: String) {
super.init()
}
}

与 Objective-C 不同,

  • Swift 的构造器是没有返回值的
  • Swift 的构造器是通过参数列表来区分的
  • Swift 的构造器默认情况下是不被继承的

Read More

IOS8-tableViewSeparatorInsetZero

iOS7 中用以下方法可使UITableView cell lines靠左

self.tableview.separatorInset = UIEdgeInsetsZero;

但在 iOS8 中该办法已失灵啦

经过翻阅 iOS8 文档发现用以下两种办法即可解决该问题

方法一:

- (void) viewDidLoad {
[...]

self.tableView.separatorInset = UIEdgeInsetsZero;
if ([self.tableView respondsToSelector:@selector(layoutMargins)]) {
self.tableView.layoutMargins = UIEdgeInsetsZero;
}
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
[...]

cell.separatorInset = UIEdgeInsetsZero;
if ([cell respondsToSelector:@selector(layoutMargins)]) {
cell.layoutMargins = UIEdgeInsetsZero;
}
}

方法二:

UITableViewCell 重写下面方法

- (UIEdgeInsets)layoutMargins{
return UIEdgeInsetsZero;
}