自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

JasonLee的专栏

一个写着几行代码的理工科文学青年。

  • 博客(209)
  • 资源 (6)
  • 问答 (1)
  • 收藏
  • 关注

原创 Improve app size and runtime performance —— WWDC 2022 随记

结论先行使用Xcode14重新构建我们的App产物,可以优化2%的OC代码大小(基于messagesendstub)。将deploymenttarget设置为iOS16开始,可以再优化2%的代码大小。

2022-06-10 12:06:15 462

原创 记一次页面区块点击无反应的问题排查

背景周五中午,烈日当空。在组织活动要求下,我和几位同事顶着大太阳去参观了章太炎故居,并在附近开了个会。搭同事顺风车回到公司,下车的时候,有点晕的我感慨了一句:“中午不睡,下午崩溃。”没想到说完这句话,我收到了一个问题反馈:某个页面的某个功能区块,用户点击了没反应。并且配套的还有程序员经典名言:我这里是好的。初步分析预期情况:用户点击区块a,会根据服务端下发的url进行页面跳转。此时用户点击后没有反应,又由于开发该页面的同学未在此处代码逻辑中添加相应日志,所以先从.

2021-07-18 22:53:15 5034 2

原创 系统性思维随谈

如果以系统性思维的方式来讨论“系统性思维”的话,那么可能会引出以下内容: 什么是系统性思维? 为什么需要有系统性思维?换一个说法就是,能在什么场景,带给我们什么好处。 要如何拥有系统性思维? 请举例说明。 发展心理学上,将人的一生按横向和纵向来进行不同维度的分析,就是一种系统性思维:这让我想起我在《我看过的一些育儿书(三)》里画的一张图:底座三个健康+认知发展是我会放到纵向的维度。我之前和娃一起画过xmind思维导图

2021-07-18 16:42:57 1707

原创 关于在CSDN写什么的一点随笔

看了一眼上一篇在CSDN写的文章的时间,发现一晃已经快3年过去了。也就是说,在这近三年的时间里,我都没有再在CSDN上发表文章了。前一阵子,我在微信群里看到邹欣老师入职CSDN担任副总裁的消息,并且抢到了一个红包。我说,都想再回CSDN写文章了。邹欣老师说,那这应该算他的KPI,哈哈。但是,写些什么呢?我最近倒是在公司内部写了一篇系列文,有不少阅读量和反馈,但不管是技术方面还是业务方面,都属于公司资产,不适合放到外网来。所以,我也在想,有什么能在外部站点(如CSDN)写一些的呢?我首先想到的

2021-04-09 19:52:23 1369

原创 WWDC18《What's new in LLVM》小记

TL;DR上周末看的部分WWDC18的视频,不过当时没来得及做些记录。 我个人的历年习惯通常是先浏览下目录,再挑一部分感兴趣的先看——通常是《What’s new in Cocoa Touch》和《What’s new in LLVM》,后续的再根据主题和实际需要再进一步了解,比如关于如何提升开发效率的。 这里主要记录下WWDC18《What’s new in LLVM》中我个人的一些观后...

2018-06-19 08:49:40 2837

原创 在使用CocoaPod的Xcode工程中断点没有调试信息的问题跟进

通常客户端产品至少都会有Debug和Release两种编译配置,在编译Release版本中会进行一些优化,以减少最终产品的体积。 比如,在Release版本中会对代码执行步骤进行优化(如O1、O2等),这会导致有些代码被优化省略掉,有时无法单步调试;另外就是会去掉符号信息,这会导致断点调试时没有符号信息,所以才会有CallStack的捕获和解析内容。由于千牛iOS端会有不同版本,分别面向内部开发者

2017-03-03 12:17:13 7298

原创 再踩Python的Shallow Copy

最近人工智能很火,Python也不可避免地跟着再火一把。 有天在微博上刚好看到这么一段话:@寒冬winter:我来谈两个新标准:写出一个动态规划(最大子段和)再谈算法,写出模拟退火、遗传和神经网三大算法之一的小demo再谈AI。这不过分吧?由于我自己也是比较注重基础的,所以挺赞同这句话的。虽然现在算法工程师经常自嘲为“调参工程师”,但那也是人家自嘲,好比写工程代码的研发工程师,也可以自嘲为“搬砖工

2017-01-25 12:02:15 3300 3

原创 Weex入门与进阶指南

原文地址:https://yq.aliyun.com/articles/57554前言相比较于React Native的“Learn once, write anywhere”,Weex的口号是“Write once, run everywhere”。考虑到React Native比较任性的向下兼容性,我们也引入了Weex做一番了解。本文主要分为以下几个部分:构建Hello World程序;集成

2016-07-08 18:22:25 82074 8

原创 记一次帮同事排查由命名引发的问题

今天同事在群里发了一个问题,问有没有人碰到类似如下的问题:-[UILabel stringByTrimmingCharactersInSet:]: unrecognized selector sent to instance 0x7ff08c865970一位同事第一反应是不是对象被释放了,出现了野指针?然而加上异常断点、开启Zombie诊断后,并没有带来有用的信息。我转身问是不是必现的?回答是的。

2016-04-20 21:20:03 6285

原创 从NSTimer的失效性谈起(二):关于GCD Timer和libdispatch

一、GCD Timer的创建和安放虽然GCD Timer并不依赖于NSRunLoop,但是有没有可能在某种情况下,GCD Timer也失效了?就好比一开始我们也不知道NSTimer对应着一个runloop的某种mode。先来看看GCD Timer的使用方法:dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TI

2016-03-15 20:34:15 6886 5

原创 从NSTimer的失效性谈起(一):关于NSTimer和NSRunLoop

一、NSTimer的失效性在iOS中要设置一个定时器的通常做法是调用如下API:+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;这个API会创建一个NSTimer对象,将其添加到当前runloop的def

2016-03-15 20:33:07 4994

原创 iOS中线程Call Stack的捕获和解析(二)

上接iOS中线程Call Stack的捕获和解析(一)。1. 部分参考资料做这一块时也是查阅了很多链接和书籍,包括但不限于:《OS X ABI Mach-O File Format Reference》《Mach-O Programming Topics》《程序员的自我修养》——这本几年前读过的,又一次从书架上拿下来温习,主要是用来对比确认;《The Mac Hacker’s Handboo

2015-11-18 16:36:55 12892 3

原创 iOS中线程Call Stack的捕获和解析(一)

这里对上个月做的一个技术项目做部分技术小结,这篇文章描述的功能和我们在使用Xcode进行调试时点击暂停的效果类似。一、获取任意一个线程的Call Stack如果要获取当前线程的调用栈,可以直接使用现有API:[NSThread callStackSymbols]。但是并没有相关API支持获取任意线程的调用栈,所以只能自己编码实现。1. 基础结构一个线程的调用栈是什么样的呢?我的理解是应该包含当前线程

2015-11-18 16:35:39 18103 1

原创 Auto Layout和UILabel

前段时间千牛iOS版本也从iOS 6.0开始支持,所以可以正式引入Auto Layout来进行界面布局。 这里记录下在UILabel上应用Auto Layout进行布局的过程。一、业务场景用三个UILabel展示一件商品的基本信息:标题,价格,销量;标题排在最上面,左右两边至少留出20的边距,可以换行;价格排在标题下面,左边与标题对齐,顶部和标题留出10的边距;销量排在价格右边,字体略小,

2015-05-25 16:40:09 7654 1

原创 在iOS中读取通讯录中联系人电话号码时需要注意的版本区别

今天遇到一个问题,发现同一个联系人的电话号码有时候读取得到,有时候读取不到。后来发现在iOS 8上是正常工作的,但是在iOS 7.1上获取到的值为空(也可能是iOS 8之前的所有版本,没有全部验证过)。123456789101112ABAddressBookRef abRef = ABAddressBookCreateWithOptions(NULL, NULL);CFArrayRef cfPer

2014-12-03 15:36:32 7543

原创 读《反欺骗的艺术》有感

上个月月底参加了CSDN的读书活动,选取了《反欺骗的艺术——世界传奇黑客的经历分享》一书。作者凯文米特尼克这个名称太吸引眼球了,而译者潘爱民老师同样是大名鼎鼎。阅读这本书的时候正值我厂IPO期间,刚好公司内部也在强调信息和数据安全的重要性,受这些因素的影响,我最近两个月也没有在外部博客上(主要是CSDN博客)写文章。接受完公司安全培训后,又阅读了该书,安全、防信息泄露的意识更加深刻了,当时脑子里面

2014-09-23 00:47:26 11014 1

原创 再谈multistage text input(中文输入法)下UITextView的内容长度限制

之前写过一篇《如何更好地限制一个UITextField的输入长度》,在文章最后得到的结论是可以直接使用UIKIT_EXTERN NSString *const UITextFieldTextDidChangeNotification;进行监听,截断超出maxLength的部分。所以后来我在处理UITextView的内容长度时,也直接参考这个方法:[[NSNotificationCenter def

2014-07-04 15:50:53 15456 6

原创 利用objc的runtime来定位次线程中unrecognized selector sent to instance的问题

昨天我们一个只有一行错误信息的问题:-[NSNull objectForKey:]: unrecognized selector sent to instance 0x537e068由于这个问题发生在次线程,所以没有太有用的堆栈信息,而是只有简单的SIGABRT信息:考虑到unrecognized selector sent to instance这类问题是由于向某个对象发送了未实现的消息,这个过

2014-06-17 15:32:16 9991 1

原创 Core Data浅谈系列之十 : 关于数据模型中实体的属性

之前写了《Core Data浅谈系列汇总》,今天稍微回顾了下,做些补充。在这个系列的第一篇《基础结构》中(2013年1月份的文章,时间过得好快啊!),有简单带过Entity的Attribute:数据类型、布尔值统一用NSNumber来表示;字符串类型用NSString表示;时间类型用NSDate表示;二进制数据类型用NSData表示;非标准类型用Transformable来表示;而Attribut

2014-06-08 20:23:37 10431 2

原创 随手记Swift基础和Optional Type(问号?和感叹号!)

距离Apple推出Swift已经有几天了,网上也时不时出现“急招Swift程序员,要求有一天工作经验”的帖子。看到Swift,除了苹果放的另外一门语言的链接(http://swift-lang.org/),还可能联想到Taylor Swift,或者铃木雨燕。这几天网上关于Swift的话题和材料应该迅速膨胀,比如StackOverflow的相关标签,还有知乎上的一些相关讨论。关于Swift的推出,我

2014-06-06 15:07:48 40021 2

原创 随手记UIKit Dynamics

趁着今年WWDC的开展,我又回顾了下去年的一些内容,发现有些新特性博客上都没有记录,想想iOS 8都出来了,iOS 7的特性再不随手记录下都晚了 :)参考WWDC 2013的Session Videos《Getting Started with UIKit Dynamics》和《Advanced Techniques with UIKit Dynamics》,随手记了以下几点:UIKit Dyna

2014-06-03 23:53:32 5638

原创 再谈iOS 7的手势滑动返回功能

之前随手写过一篇《使用UIScreenEdgePanGestureRecognizer实现swipe to pop效果》,挺粗糙的。现在使用默认模板创建的iOS App都支持手势返回功能,如果导航栏的返回按钮是自定义的那么则会失效,也可以参考这里手动设置无效。if ([self.navigationController respondsToSelector:@selector(interactiv

2014-06-03 20:00:13 87797 5

原创 Inside ARC — to see the code inserted by the compiler

这里的主题是“Inside ARC”,顾名思义,主要是探讨ARC在我们看不见的地方为我们做了什么事情,以及怎么做的。出发点是对底层实现的兴趣,不了解这些也不妨碍写好代码,了解一点应该有益。

2014-05-23 11:12:42 5393 2

原创 使用Objective-C处理UBB标签

有这么个业务需求,抽象出来如下:展示一条文案,比如“某某人做了某某事”,这里的“某某人”是一个用户的昵称;用户可以修改昵称,修改过后再看之前的文案,“某某人”这个昵称需要跟着变化;文案数据从服务端获取;根据上述需求,讨论确定了服务端下发的“某某人”采用[UserId]uid[/UserId]这样的UBB标签格式,客户端进行解析和替换。要解析内容,首先要匹配指定的UBB标签,

2014-05-23 10:06:29 4306

原创 又是一年WWDC,暨回顾去年之旅——Part III

前言不管这篇写到哪里,就以这篇作为结尾,结束这个流水回顾系列文了。Computer History Museum计算机历史博物馆(网站)是在Google旁边,参观Google之前的行程。记得那是一个阳光明媚的日子,在前往硅谷朝圣的路上,内心还是有点小激动的。临走前我买了顶帽子作纪念,也刚好用来抵御湾区的大太阳。Google大家在计算机历史博物馆外

2014-05-13 00:36:40 3304

原创 又是一年WWDC,暨回顾去年之旅——Part II

前言一晃就是一周过去了,距离上一篇《又是一年WWDC,暨回顾去年之旅——Part I》。今天天气凉爽,中午打扫了下房间,下午去打了会羽毛球和篮球,现在洗漱完毕,清爽写点文字,还是蛮惬意的。按照之前的“后续”,这篇会谈些WWDC大会本身。签到报道时间是在大会正式开始前一天,如果没记错的话应该是星期天。那天我们提前到达了旧金山的downtown,记得当时汽车逐渐驶入市区

2014-04-21 00:36:53 2951

原创 如何更好地限制一个UITextField的输入长度

要限制一个UITextField的输入字数(参考链接),首先想到的应该是通过UITextFieldDelegate的代理方法来限制:- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(N

2014-04-15 16:55:31 107778 9

原创 又是一年WWDC,暨回顾去年之旅——Part I

前言记得去年WWDC抢票改制,2分钟就sold out了。今年再度改制,改成随机挑选了。本来报名后我已经忘记这件事情了,没想到某天打开邮箱一看:由于去年我已经去过了,感觉有点累,而且觉得Apple的工程师交流起来挺保守的(或许他们内部不同部门的沟通也很保守),所以今年兴致不是很高。另一方面是觉得,这种好事不能总是自己占着,应该换一批同学去。当然,公司层面是需要有去过的同学带队比

2014-04-14 00:06:58 3226 1

原创 在iOS上实现一个简单的日历控件

近期需要写一个交互有点DT的日历控件,具体交互细节这里略过不表。不过再怎么复杂的控件,也是由基础的零配件组装起来的,这里最基本的就是日历控件。先上图:从图中可以看出日历控件就是由一个个小方块组成的,每一行有7个小方块,分别表示一周的星期天到星期六。给定一个月份,我们首先需要知道这个月有多少周。那么如何确定一个月有多少周呢?我是这么想的,在NSDate上做扩展:@in

2014-03-24 19:33:44 68780 8

原创 iOS应用的crash日志的分析基础

Outline如何获得crash日志如何解析crash日志如何分析crash日志     1. iOS策略相关     2. 常见错误标识     3. 代码bug一、如何获得crash日志当一个iOS应用程序崩溃时,系统会创建一份crash日志保存在设备上。这份crash日志记录着应用程序崩溃时的信息,通常包含着每个执行线程的栈调用信息(低内存闪退日志

2014-02-10 10:46:58 53999 16

原创 2013-2014小结留白

2013年到2014年之间的蛇年,经历了很多事情,零碎记录在Evernote中,如果有时间,再摘取些合适的放在博客上。

2014-01-19 18:31:04 2275 4

原创 关于大数据量下Core Data的数据迁移

Core Data版本迁移基础通常,在使用Core Data的iOS App上,不同版本上的数据模型变更引发的数据迁移都是由Core Data来负责完成的。这种数据迁移模式称为Lightweight Migration(可能对于开发人员来说是lightweight),开发人员只要在添加Persistent Store时设置好对应选项,其它的就交付给Core Data来做了:

2014-01-04 14:52:07 15092 7

原创 使用代码跟踪iOS App的内存使用情况

摘自Stackoverflow:http://stackoverflow.com/a/7990532/889538#import "mach/mach.h"vm_size_t usedMemory(void) { struct task_basic_info info; mach_msg_type_number_t size = sizeof(info); ke

2013-12-30 18:07:31 7301

原创 在iOS上present一个半透明的viewController

今天尝试着在一个ViewController上面调用:- (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated来展示一个半透明的viewController: UIViewController *vc = [[[UIViewControlle

2013-12-06 20:32:52 31810 6

原创 【iOS 7】使用UIScreenEdgePanGestureRecognizer实现swipe to pop效果

在iOS 7还没有发布的时候,各种App实现各种的swipe to pop效果,比如这里有一份简单的demo。在iOS 7上,只要是符合系统的导航结构:- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ self.

2013-11-21 20:31:27 17711 2

原创 becomeFirstResponder无法调起键盘

今天发现一个问题,落在具体代码上是一个UITextView的子类在调用becomeFirstResponder函数后,键盘没有呼出来。首先检查了该子类的相关函数,比如:- (BOOL)canBecomeFirstResponder{之类的,都是return YES,但当调用时:BOOL bRet = [_inputTextView becomeFirstResponder];却是re

2013-11-20 16:49:43 22756 3

原创 缺失version model的情况下能否完成Core Data的数据迁移?

今天遇到一个问题,问题描述见此 http://stackoverflow.com/q/20062215/889538。为此进行了一番验证。我有一个Demo工程,叫做cdNBA,其数据模型如下:然后基于cdNBA新建了两个分支:cdNBA1和cdNBA2,分别对数据模型进行修改。cdNBA1工程创建了cdNBA 5.xcdatamodel,并安装到模拟器上写过数据。

2013-11-19 20:32:06 2169

原创 随手记今天跟的几个iOS项目代码的问题

休了一阵子假期,今天刚回来上班,项目代码已经有挺大的变化了,我就先体验、发现、跟进问题。第一个问题是点击某个cell就挂掉的现象,同事表示必现但挺神奇。由于挂掉的时候没有啥有意义的信息,所以先简单粗暴地在- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

2013-11-18 21:04:29 3345

原创 再看Core Data中PSC陷入死锁的问题

在《Core Data Programming Guide》文档的Concurrency with Core Data这一章节中提到了“Use Thread Confinement to Support Concurrency”,这里的“Thread”还包含serial operation queue和dispatch queue。我目前的理解是MOC会负责对PSC进行加锁解锁,这些动作需要保

2013-10-29 16:03:17 2883

原创 Core Data多线程环境下pendingChange引发的排序不对问题

这是一个起初看起来很神奇的问题,大意如下:有一个Table,展示多个消息会话,这些消息会话按最新消息时间排序;某种情况下,新收到一条消息,时间展示为最新,但这条消息没有排在最上方。因为界面上展示的时间是最新的,所以刚开始遇到这个问题的第一反应是看看数据库里面的时间戳是不是正确的,查看后确认时间是最新的没错。一时陷入了僵局,因为问题很难重现。所以梳理了下逻辑:

2013-09-29 16:20:14 2780 1

xcode_doxygen_helper

xcode_doxygen_helper

2013-07-30

Python-share-slide

Sth. about CPython.

2013-01-22

BasicImageFilter

图像滤镜基础

2012-08-16

[Qt Topic] – 全局热键、托盘功能和随机启动

[Qt Topic] – 全局热键、托盘功能和随机启动 配套http://blog.csdn.net/jasonblog/archive/2010/04/25/5525826.aspx

2010-04-25

多语言简易天气预报器[Qt]

多语言简易天气预报器[Qt] 这是http://blog.csdn.net/jasonblog/archive/2010/04/02/5445191.aspx所配套的源码。 鉴于有不少朋友陆续发邮件给我,所以放到这里来了。

2010-04-12

用Qt编写的聊天室源码

简单聊天室(Qt) 用Qt编写的聊天室源码

2010-01-22

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除