UIView 显示调试边界

作为 iOS 开发者,我一直羡慕 Android 强大的开发者选项,如显示视图边界等。 而这一简单的功能,直到最近几个版本的 Xcode 才支持。真机调试运行起来后,点击 Debug -> View Debugging -> Show View Frames 效果如下图: 然而,只能在真机连接到 Xcode 时才能开启, »

所见即得的正则表达式

一般开发中,时不时需要用到正则表达式。然而不像 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 /,依然好用! »