所见即得的正则表达式

一般开发中,时不时需要用到正则表达式。然而不像 JavaScript 等语言一样有方便的原生支持,在 Objective-C 等语言中需要用字符串来生成正则表达式对象,而做为字符串字面量,它免不了需要转义。 JavaScript 版本 var reg = /^1\d{10}$/; // 判断中国大陆手机号 Objective-C 版本 NSNSRegularExpression *reg = [NSRegularExpression regularExpressionWithPattern:@"^1\\d{ »

iOS 设备跟踪 GPU 使用率

关于如何用代码跟踪 App 的 CPU 使用率,网上相关文章已经很多了,但是很难搜索到 GPU 使用率相关的东西。这个原因可能是多样的: App 开发者一般不太关心 GPU 使用的问题,游戏开发者更关心一些。而游戏开发的有很强大的 Unity 工具可以实时跟踪 最近的 Xcode 本身也提供了 GPU 跟踪的功能(仅当 App 中存在 »

Block 调用检查

前言 如何确保一个传递给别人的 Block 被调用过,是一个一直困扰我的问题,因为 Block 作为 iOS 的一种回调机制,它可以像函数一样马上被调用,也可以像对象一样被持有、被传递、被释放,并在将来的某个时候被调用。有些时候我们传出去的 Block 必须被调用一次,否则会处于一种不确定的状态而导致程序无法继续,或者出错。例如,之前一篇文章《一种 App 内路由系统的设计》中的路由注册方式, »

安全的 keypath

有更简单的方法,以下不要再看了吧。。。 #define MZKeyPath(OBJ, PATH) \ (((void)(NO && ((void)(((typeof(OBJ))nil).PATH), NO)), @# PATH)) // 支持类或实例两种写法: - (void)viewDidLoad { [super viewDidLoad]; MZKeyPath(NSString *, lowercaseString. »

讯飞输入法 iOS 版的一个 Bug

一个正常的 UITextField,当有中文后跟一个英文字母时,删除这个英文字母,收不到文字变化的回调。 UITextField *textField = ...; [textField addTarget:self action:@selector(onTextChanged:) forControlEvents:UIControlEventEditingChanged]; 然后又尝试监听通知,也不行。暂时无解,搜狗、百度等键盘没有发现此问题。 UITextField *textField = ...; [[NSNotificationCenter defaultCenter] addObserver:self »

PHAsset 获取图片高宽的 Bug

最近遇到一个在 App 中打开相册 Crash 的问题,但是我们无法复现,于是找用户要到了她要上传的图片的原图,原图是一张微博等平台上常见的超长图片。现在不少专业的博主为了排版方便及全平台统一,都会使用一整张长图来发内容,而不是用图文混排的方式。 图片导入到相册后发现的确会 Crash,于是单步跟进,发现这张图片高度居然是 18446744073709519761!很明显不正常,因为在电脑上查看图片高度为 33681,如果 App 认为它高度是那么多,就会照那个大小去申请内存,不 Crash 才怪。 »

快速添加注释文档(Document Comment)

在 Xcode 8 之前,我们可以使用非常好用的插件 VVDocument 来快速添加注释文档,默认设置下只需在要注释的方法上方连按三个 / 即可: Xcode 8 加入了一些签名的限制,使得无法再加载任意的第三方插件(开发让苹果认可的插件方法戳我,破解方式戳我),所以 VVDocument 也就无法再使用了。但是它自带了,在方法名上方按下 Command Option /,依然好用! »

一种 App 内路由系统的设计

本文仅探讨怎样才是路由系统该有的设计,并不涉及具体实现 App 发展到一定程度时,页面越来越多,工程越来越大,合作开发的人也越来越多,这时就可能需要引入路由系统(当然,从项目一开始启动就接入路由是最好不过了)。路由系统提供了一种简单的方式,让用户在不同页面间浏览时就像在浏览器中访问网页一样,一个地址对应一个完整内容的页面(一般使用 RESTful 的风格),如: Foo://users/nickname,打开用户页面 Foo://products/xxxx,打开商品页面 Foo: »