WeRead团队博客


  • 首页

  • 归档

GYDataCenter:高性能数据库框架

发表于 2016-07-06   |   作者: zepo   |  

GYDataCenter 是一个 SQLite 数据库框架,提供了一套简单易用的面向对象的数据操作接口,同时保留了 SQL 查询的灵活性。GYDataCenter 简单易上手,相对于 CoreData,GYDataCenter 的学习成本更低。同时,根据自己的需求,开发者可以更方便地划分数据库,设计数据库表,数据库索引等。

概览

GYDataCenter 具有以下特性:

  • 面向对象的数据操作接口
  • 使用 SQLite 的 where 语句做为查询条件
  • 自动创建及更新数据库表
  • 高性能 cache 层
  • faulting 机制(类似 Core Data)
  • 自动批量写入磁盘
  • 使用 ANALYZE 优化查询
阅读全文 »

如何动态调用 C 函数

发表于 2016-07-05   |   作者: bang   |  

JSPatch 支持了动态调用 C 函数,无需在编译前桥接每个要调用的 C 函数,只需要在 JS 里调用前声明下这个函数,就可以直接调用:

1
2
3
require('JPEngine').addExtensions(['JPCFunction'])
defineCFunction("malloc", "void *, size_t")
malloc(10)

我们一步步来看看怎样可以做到动态调用 C 函数。

函数地址

首先若要动态调用 C 函数,第一步就是需要通过传入一个函数名字符串找到这个函数地址,这里一个必要的前提条件就是 C 编译后的可执行文件里必须有原函数名的信息,才有可能做到通过函数名字符串找到函数地址。我们写个简单的程序来看看它编译后可执行文件的内容有没有这个信息:

1
2
3
4
5
6
7
//main.m
void test() {
}
int main() {
return 0;
}

编译这个文件,并用otool看下它的汇编:

1
2
gcc main.m -o main.o
otool -tV main.o

输出:

阅读全文 »

面向切面编程之 Aspects 源码解析及应用

发表于 2016-06-30   |   作者: zach   |  

1. 背景

最近在做项目的打点统计的时候,发现业务逻辑和打点逻辑经常耦合在一起,这样一方面影响了正常的业务逻辑,同时也很容易搞乱打点逻辑,而且要查看打点情况的时候也很分散,因此想着如何将两者解耦,并将打点逻辑集中起来。其实在 web 编程时候,这种场景很早就有了很成熟的方案,也就是所谓的 aop 编程(面向切面编程),其原理也就是在不更改正常的业务处理流程的前提下,通过生成一个动态代理类,从而实现对目标对象嵌入附加的操作。

在 iOS 中,要想实现相似的效果也很简单,利用 OC 的动态性,通过 swizzling method 改变目标函数的 selector 所指向的实现,然后在新的实现中实现附加的操作,完成之后再回到原来的处理逻辑。想明白这些之后,我就打算动手实现,当然并没有重复造轮子,我在 github 发现了一个基于 swizzling method 的开源框架 Aspects 。这个库的代码量比较小,总共就一个类文件,使用起来也比较方便,比如你想统计某个 controller 的 viewwillappear 的调用次数,你只需要引入 Aspect.h 头文件,然后在合适的地方初始化如下代码即可。

1
2
3
4
5
- (void)addKvLogAspect {
[self wr_Aspect_hookSelector:@selector(viewWillAppear:) withOptions:AspectPositionAfter usingBlock:^{
KVLog_ReviewTimeline(ReviewTimeline_Open_Tab);
}error:NULL];
}

这篇文章主要是介绍 Aspects 源码以及其思路,以及我在实际应用中遇到的一些问题。对 swizzling method 不了解的同学可以先去网上了解一下,下面的内容是基于大家对 swizzling method 有一定的了解的基础上的。

阅读全文 »

iOS 启动连续闪退保护方案

发表于 2016-05-23   |   作者: rich   |  

引言

“如果某个实体表现出以下任何一种特性,它就具备自主性:自我修复、自我保护、自我维护、对目标的自我控制、自我改进。” —— 凯文·凯利

iOS App 有时可能遇到启动必 crash 的绝境:每次打开 App 都闪退,无法正常使用App。

为了尝试解决这个问题,微信读书开发了 iOS 连续闪退保护工具:GYBootingProtection,检测连续闪退,在连续闪退出现时,尝试自修复 App:

img

本文探讨了连续闪退问题的产生原因、检测、修复机制,以及如何在你的项目中引入、测试和使用 GYBootingProtection。

阅读全文 »

微信读书 iOS 性能优化总结

发表于 2016-05-03   |   作者: hypo   |  

微信读书作为一款阅读类的新产品,目前还处于快速迭代,不断尝试的过程中,性能问题也在业务的不断累积中逐渐体现出来。最近的 1.3.0 版本发布后,关于性能问题的用户反馈逐渐增多,为此,团队开始做一些针对性的性能问题优化。本文将从发现问题、解决问题和预防问题三个方面进行总结。

如何发现性能问题

不同于一般的 bug,性能问题因为并没有统一的标准,而且与用户的机器环境相关性较大,所以往往是在产品上线后才被发现,也导致解决问题的周期很长。微信读书 1.3.0 版本之前,性能问题基本都来自于用户反馈(包括测试人员),受限于测试时间和用户反馈的积极性,性能问题往往到了比较严重的程度,开发人员才真正发现问题。

但是,移动应用要保证良好的用户体验,产品在性能方面的表现极其重要。为了尽可能早、尽可能全面地收集产品的性能问题,就避免不了对产品做性能监控。我们主要从两个维度进行了监控:

阅读全文 »

iOS 组件化方案探索

发表于 2016-03-19   |   作者: bang   |  

看了 Limboy(文章1 文章2) 和 Casa (文章) 对 iOS 组件化方案的讨论,写篇文章梳理下思路。

首先我觉得”组件”在这里不太合适,因为按我理解组件是指比较小的功能块,这些组件不需要多少组件间通信,没什么依赖,也就不需要做什么其他处理,面向对象就能搞定。而这里提到的是较大粒度的业务功能,我们习惯称为”模块”。为了方便表述,下面模块和组件代表同一个意思,都是指较大粒度的业务模块。

一个 APP 有多个模块,模块之间会通信,互相调用,例如微信读书有 书籍详情 想法列表 阅读器 发现卡片 等等模块,这些模块会互相调用,例如 书籍详情要调起阅读器和想法列表,阅读器要调起想法列表和书籍详情,等等,一般我们是怎样调用呢,以阅读器为例,会这样写:

1
2
3
4
5
6
7
8
9
10
11
12
13
#import "WRBookDetailViewController.h"
#import "WRReviewViewController.h"
@implementation Mediator
- (void)gotoDetail {
WRBookDetailViewController *detailVC = [[WRBookDetailViewController alloc] initWithBookId:self.bookId];
[self.navigationController.pushViewController:detailVC animated:YES];
}
- (void)gotoReview {
WRReviewViewController *reviewVC = [[WRReviewViewController alloc] initWithBookId:self.bookId reviewType:1];
[self.navigationController.pushViewController:reviewVC animated:YES];
}
@end
阅读全文 »

GYHttpMock:iOS HTTP请求模拟工具

发表于 2016-02-25   |   作者: hypo   |  

GYHttpMock 是刚开源的 iOS 请求模拟工具,用于iOS App网络层开发,可以截获指定的 HTTP request,并根据规则,完全替换或部分修改真实的网络返回数据。

背景

iOS App开发过程中,前台开发过程通常都是并行进行的,因此难免会出现一些客户端需要等待后台开发联调的情景,等待的过程往往痛若而无奈(后台被催得痛苦,前端无奈等待)。通常解决办法是,客户端在某处 hardcode 网络返回数据,当然,一不小心,这种测试代码被提交到了线上也是常有的事情。还有更“高级”一点,通过设置代理,用抓包工具修改网络数据,但这种效率低得令人抓狂。

引入一个可以模拟网络请求的工具似乎就可以轻松满足需求,但实践证明,“模拟网络请求”这个需求并不简单。例如对于全新的业务,后台如果还没有数据,前端完全可以根据协议自己制造假数据返回。但是,很多情况下,可能是对已有业务的变更,也就是需要修改后台已有的业务数据。

阅读全文 »

MLeaksFinder:精准 iOS 内存泄露检测工具

发表于 2016-02-22   |   作者: zepo   |  

背景

平常我们都会用 Instrument 的 Leaks / Allocations 或其他一些开源库进行内存泄露的排查,但它们都存在各种问题和不便,我们逐个来看这些工具的使用和存在的问题。

Leaks

先看看 Leaks,从苹果的开发者文档里可以看到,一个 app 的内存分三类:

  • Leaked memory: Memory unreferenced by your application that cannot be used again or freed (also detectable by using the Leaks instrument).

  • Abandoned memory: Memory still referenced by your application that has no useful purpose.

  • Cached memory: Memory still referenced by your application that might be used again for better performance.

其中 Leaked memory 和 Abandoned memory 都属于应该释放而没释放的内存,都是内存泄露,而 Leaks 工具只负责检测 Leaked memory,而不管 Abandoned memory。在 MRC 时代 Leaked memory 很常见,因为很容易忘了调用 release,但在 ARC 时代更常见的内存泄露是循环引用导致的 Abandoned memory,Leaks 工具查不出这类内存泄露,应用有限。

阅读全文 »
12

18 日志
8 分类

开源项目

JSPatch
MLeaksFinder
GYHttpMock
GYBootingProtection
GYDataCenter
GYMonitor
© 2020
程序 - Hexo
主题 - NexT.Mist
微信读书