CALayer 的 filters

CALayer 上有一个属性,一直以来大家都容易忽视,即:filters。而苹果官方文档上只给了 CIFilter 的示例,但事实上 CIFilter 设置进去后并没有效果,同时下方也指明了在 iOS 上不支持。(这里是 CIFilter 的完整列表) @interface CALayer : NSObject <NSSecureCoding, CAMediaTiming> /* An array »

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 才怪。 »