自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

海洋顶端

仅作为个人总结,如有错误,欢迎指正

  • 博客(78)
  • 资源 (1)
  • 收藏
  • 关注

原创 函数响应式编程(FRP)思想

ReactiveCocoa是IOS广为使用的技术框架,而ReactiveCocoa的核心思想就FRP。FRP不同于JAVA的object-oriented和AOP,FRP能让你的代码像数学一样简洁,业务像流水一样清晰流畅。函数响应式编程响应式编程思想为体,函数式编程思想为用。

2017-03-14 20:24:55 7046 3

原创 编辑距离算法应用总结

因为项目需要,学习并应用了编辑距离算法,今天做个总结。(作为业务工程团队的同学,平时应用算法解决问题的机会并不多,但是能力 / 思维还是要有,对技术架构 / 技术选型都有帮助,真的落地实现,算法资源不足的时候,也能顶上)。编辑距离算法可以用于衡量文本相似度,进而解决文本的模糊搜索 / 匹配问题。编辑距离算法时间复杂度是 O(mn),如果文本数量(t)较大,遍历文本集合,计算关键字和文本 Pair ...

2020-04-06 16:10:50 949

原创 说说网络协议

作为一个业务团队的开发,网络请求多是用基础架构团队提供的能力。之前做过一次对比,发现公司基础架构团队提供的网络库比标准 http 快很多(差不多一倍),看来确实做了不少改进,就去看了一下他们的文档。现在大多数的应用应该都需要高频的网络请求,对网络库的优化价值是巨大的。核心的优化有三点。1. 长连接。keep-alive。这个比较常见。http 1.0 是发次 http 请求建立一个 tcp 连接,...

2020-03-08 21:01:29 194

原创 说说补码

所有的数学原理,背后都是最简单最自然的思维和道理而已!首先我们知道一个数在计算机里是用其补码形式表示、参与计算的(机器数)。补码被设计出来就为了 CPU 可以把减法当加法算。而把减法当成加法算,原理和我们算法里学的“减一个数等于加上这个数的负数”是类似的,计算机里把减法当成加法算的原理简单来说是“减一个数等于加上这个数的补,然后取余”。具体实现的时候,巧妙的使用了符号位,对于大数减小数,可以理解为...

2020-03-08 17:08:21 609

原创 移植 C/C++ 代码至 Android 平台经验总结

算法同学提供了一个图像分析能力,使用 C/C++ 实现,依赖了 Tensorflowlite、 OpenCV 等库。要在 Android 上使用这个能力,需要进行移植。移植可分为两步,第一步是面向 Android 设备的指令集构建 C/C++ 代码以及其依赖的库,第二步是编写一个 Wrapper 封装第一步生成的库并供 JNI 调用。针对第一步,我们首先要知道我们要部署的 Android 设备用...

2020-02-11 14:13:21 2070

原创 Xcode 利用 Target 机制定制构建过程的一次尝试

    标题太拗口了。事情是这样的,之前对 Target 有所了解,可是没有自己运用过,刚巧有个事情,我觉得可以借助 Target 机制,就动手实践了一下,今天总结一下。这个事情是我们有个库不支持 x86 平台,导致我们的 app 不能用模拟器调试。用这个库是个非常边缘的业务,所以采取方案是自定义一个 Target,构建出没有这块业务和这个库的产物用,然后用模拟器调试。(用两个分支显然不如用两个 ...

2019-05-07 21:43:02 189

原创 ZBar 源码分析 beta

前言身在物流行业,扫描条码的场景很多。为了改造 ZBar 使其返回条码方向(条码与水平线的夹角),阅读了 ZBar 的源码。总结一下。(没有弄清楚所有细节,只说说我弄清楚的部分)主流程应该大家都知道 ZBar 是 Z 字型扫描的。(为什么要 Z 字型扫描?不清楚。)一次扫描一行或者一列,在扫描过程中做滤波,EWMA,指数加权移动平均,可以消除部分噪声影响,然后计算梯度变化,确定边缘,计算当前...

2019-04-21 17:31:56 1698

原创 YUV 400 格式图像转换成 ARGB 格式图像中犯的一个低级 Bug

一、背景    最近在做 Android 巴枪项目,借助巴枪上面的二维扫描头拍照,然后去做 OCR。这属于定制需求,只能去和各个巴枪厂家去对接。后来厂家陆续暴露给了我们这个能力,但是接口都不一样(领教了 Android 的碎片化)。这个 Bug 就出在我适配一款巴枪的过程中。二、Bug    这个厂家的 SDK 设计是通过回调的方式把图片数据返回给我。只有一个 byte 数组,不知道宽、高,...

2019-01-18 18:01:30 1715

原创 Objective-C 消息机制学习总结

    message 机制可以说是 objc 最重要的特征,没有之一。零零散散看了 method cache、method search 以及 message forward,串一串,总结一下。 message 机制带来很大的灵活性,调用和实现完全解耦,实现上也力求高效,毕竟 send message 是非常频繁的操作。流程概括来说可以分为三步查 cache ,命中则返回 imp,miss ...

2018-11-09 16:10:35 251

原创 Weak 指针源码学习

    weak 指针,大家都不陌生。之前也简单学习了一下,总结了一下对象在回收时 weak 指针是如何被 nil 掉的。不过我对 weak 指针的一些方面还有一些疑问,所以去看了一下源码。我的疑问主要是:weak 指针使用时,会对所指对象进行 retain 吗,还是需要我们手动的去做这件事,如何保证指针使用期间所指对象不被 dealloc 的?为什么要用 hash set 存 weak 指...

2018-11-02 16:34:52 260

原创 iOS 实现音频流播放器中踩的内存管理相关的坑

    App 作为工具应用,具备语音提醒的能力。语音是调用云服务进行合成的,这样做灵活些,新增提醒不用准备相应的语音文件。云服务合成音频,以流的方式返回到端上,端上使用 Audio Queue 播放。流式播放,可以抽象为生产者-消费者问题。云是我们的生产者,麦克风是我们的消费者。Audio Queue 已经把问题解决一半了,它创建了 Buffer,提供钩子告诉我们Buffer可用,提供接口让我们...

2018-07-25 17:14:38 586

原创 iOS 内存

    观看 Fixing Memory Issues、App Startup Time: Past, Present, and Future 两个视频的总结。一、Virtual Memory VS Physical Memory    Virtual Memory 是开发者视角的 memory,会分多个 region(code region、heap region(maybe))),re...

2018-07-21 12:05:31 333

原创 objective-c non-fragile ivars 学习笔记

    最近想要对我维护的 App 做启动优化,观看了这两个视频,Optimizing App Startup Time、iOS App Performance: Responsiveness。视频干货满满,涉及到了 iOS 可执行文件的结构、系统是如何启动 App 的等等底层知识,需要慢慢消化。针对其中的一个点,non-fragile ivars offset update ,这个启动流程中的一...

2018-07-15 10:50:54 587

原创 Mach-O Executable 文件结构

    看这篇文章,获益匪浅,解答了我一直以来的关于我的代码最终是如何在机器跑起来的疑惑,总结一下。    首先,一个可执行文件,.out 文件,内部会分为多个 Segment,比如:__TEXT: 放的是机器码,是 CPU 可以理解、执行的指令__DATA: 放的是数据__PAGEZERO: 一个坑位,会在 VM 当中占 4GB 的,    当我们运行一个应用的时候,VM (...

2018-06-30 18:35:50 454

原创 CocoaPods到底做了什么

CocoaPods到底做了什么    CocoaPods 到底做了什么,还是需要了解一下,否则构建出了问题,根本无从下手解决。查了一些文档,创建了 Demo ,用 Git 看 CocoaPods 到底新增、修改了哪些文件,总结一下。    首先 CocoaPods 设计出来是要解决两个问题,一是 library 的管理问题,二是 library 的发现问题,是标志的依赖管理工具,可以让我们...

2018-06-17 19:42:09 735

原创 Archive Invalid Bitcode Signature 错误不能通过设置 Release Build Active Architecture Only 为 YES 来解决

Archive Invalid Bitcode Signature 错误不能通过设置 Release Build Active Architecture Only 为 YES 来解决    今天在项目中遇到了这个问题。这也不是第一次遇到了。之前使用的解决方案都没能奏效,包括 Clean、Delete Derived Data、重启 Xcode 以及检查是不是有别的错误提示。后来,尝试设置 Re...

2018-06-09 17:45:48 1664

原创 当我们在设置 Other Linker Flags -lstdc++时,我们到底在设置什么?

问题    最近在玩儿 OCR ,使用了开源的 OCR 引擎 — TesseractOCR。编译遇到了如下问题:    搜索到两个解决方案,测试之后都是奏效。一是在 Other Linker Flags 中新增标志 -lstdc++,二是在 Linked Framework and Libraries 中 add libstdc++.tbd.原理    这是个混编问题。Tess...

2018-06-03 18:34:45 1639

原创 TesseractOCR-iOS 无法找到 traineddata 文件问题 & Xcode Group 与 Folder Reference 的区别

TesseractOCR-iOS 无法找到 traineddata 文件问题 & Xcode Group 与 Folder Reference 的区别最近在玩儿 OCR,运行 APP 的时候遇到了一个找不到资源文件的问题,导致无法识别。Google 了一下,把资源文件的引入方式从 Group 改成 Folder Reference,问题就解决了。但是不知道为什么呢,就继续查了一些资料。...

2018-06-03 17:20:45 793

原创 扫描图像场景下平移手机的运动检测方法探索

最近的项目中,需要连续的扫描图像进行图像识别。(之所以是用扫的方式,而不是用拍的方式,是为了后面做自动化,扫其实是自动的拍,摄像头打开,视频流过来,我要有能力知道我要用哪一帧,而不是用户去拍)。扫描的过程中,我不可能把每一帧都识别一下,这个开销太高,而且也没有必要,很多帧是重复。所以,我需要采样策略,我的采样策略是先判断手机是否在运动,后面再判断图像质量,因为图像分析有一定开销,轻量的漏斗放前面,...

2018-05-14 21:42:03 615

原创 一个 double 类型精度问题导致的 Bug

在项目中,遇到一个 Bug —— 显示的订单 ID 不对,和 API 测试平台获取的数据不一致。首先怀疑的是取错字段了,认真检查了一下,不是这个原因。然后怀疑的是 Native 网络请求模块 JsonString 转 Model 的时候出错了,Debug 了一下发现网络请求的结果解析成的 Model 里面的 ID 是对的,也不是这个原因。那问题就一定是出在 ID 从 Native 传递到 JS 环...

2018-05-13 16:47:54 3450

原创 ‘BAD_ACCESS‘ 错误解决记录,一个与 ‘__bridge‘ 有关,一个与 ‘out parameter‘ 有关

EXC_BAD_ACCESS(code=EXC_I386_GPFLT) __bridge out parameterNSError **

2017-08-06 13:52:55 678

原创 Block的内存管理以及变量Capture

总的来说,Block = 匿名函数 + Capture变量。它的用途包括:作为匿名函数使用,即把函数定义在使用到的地方,逻辑更加集中。Capture变量,可以capture Block定义所在的作用域内的变量,类似于保存上下文,Block在别处被调用时,好像具备Block定义所在的上下文一样可以正常执行,这些都是OC做的事情。

2017-05-07 13:53:15 530

原创 autorelease的使用场景

autorelease是解决函数返回值引用计数问题的一种方式。考虑这样一个场景,我们有个方法返回一个对象,在方法内部我们retain了这个对象,这意味这我们需要release这个对象,维持对象引用计数的平衡。但是因为这个对象是返回值,我们要确保调用方拿到的对象是没被回收的,在函数返回前release存在导致对象被回收的风险。也就是说,我们需要release返回值,但又不能在函数返回前。

2017-05-07 13:50:22 1495

原创 Run loop简析

前言以前是Android开发,接触过Android里面的Looper、Handler、MessageQueue这些概念,尝试类比着来理解Run Loop。二、为了解决什么问题一句话总结,为了调度任务。 具体来说可以在特定时间点执行某个任务(延后某个任务的执行)可以在特定线程上执行某个任务(将某个任务分发到特定线程上去执行)

2017-04-22 15:46:42 308

原创 改进RACCommand──一句话完成工作信号的创建、Next/Error事件的订阅,并保证互斥执行

前言本文将会介绍RACCommand进行异步操作(比如网络请求)的用法,分析其中存在的问题。然后介绍改进方案STButtonSignal的用法,给出STButtonSignal的原理以及具体实现。

2017-03-20 15:06:52 2703

原创 RAC扩展──异步filter、map

RAC有非常丰富的Operation,可以让我们的开发事半功倍。常用的比如:filter、map。但是原生的filter、map要求我们在Block同步返回结果。但是,有的时候,我们只能异步返回结果。比如我们需要根据用户的输入进行filter(二次确认);比如我们需要先请求网络才能进行map。所以,我对原有的Operation进行了扩展,开发了asyncFilter、asyncMap。

2017-03-14 20:15:05 1655

原创 MJRefresh中异步更改UI为Refreshing状态导致内部状态和UI状态不一致的问题

在MJRefreshHeader类setState方法中“更改UI为refreshing状态”的操作是异步的。也就是说,设置Refreshing状态时,设置内部状态和设置UI状态被分离开了,如果在中间插入了设置内部状态(比如Idle)的操作可能会导致内部状态和UI状态不一致的问题。另外,MJRefreshendRefreshing方法中“设置状态为Idle”操作是异步的。

2016-09-20 11:26:56 3415 1

原创 RAC中Multicast的实现原理分析

内部是利用RACSubject在中间转发消息,RACSubject(`_signal`)订阅真正的Signal(`sourceSignal`),外部Subscribers订阅RACSubject(`_signal`)

2016-08-27 16:08:30 1528

原创 UIButton使用RACCommand后setEnable方法失效的问题

真正的问题是RACCommand内部调用setEnable方法,可能会覆盖你手动设置的UIButton状态。无论你在初始化RACommand时是否传入enabledSignal,RACCommand内部都会控制UIButton的enable/disable状态。我们在外部也调用setEnable方法设置enable状态,可能会冲突。

2016-08-25 15:30:44 2645

原创 IOS7.0系统上,特定颜色调用`- getRed:green:blue:alpha:`方法返回结果有误的问题

在7.0系统上对[UIColor whiteColor]调用这个API,获取R、G、B值是错误的,均为接近0的小数,正确的结果是1。

2016-08-24 19:09:04 1019

原创 对象回收时 Weak 指针自动被置为 nil 是如何实现的

Weak表Runtime维护了一个Weak表,用于存储指向某个对象的所有Weak指针。Weak表其实是一个哈希表,Key是所指对象的地址,Value是Weak指针的地址(这个地址的值是所指对象的地址)的数组。

2016-08-24 14:27:02 4944 2

原创 从源码角度分析RACObserve的实现原理(一)

RACObserve

2016-08-21 17:07:47 3684

原创 简单功能的正则表达式引擎实现

功能非常简单,只是检查 text 的前缀是否与 reg_exp 匹配,并不去检查 text 中间是否有与 reg_exp 匹配的子串。纯递归实现

2015-10-20 10:43:43 417

原创 Windows风格的Loading动画Android实现(3)

前言最近在学习开源弹幕引擎源码,其中对重绘的控制的很好,值得学习,我把一部分技术应用到我的这个动画里面。第一,在这个弹幕引擎里面,各个弹幕相互独立,独立计算独立绘制。第二,不过度绘制,这种情况是丢帧的反面。简单来说就是不要在16ms内绘制两次,因为当fps大于60之后,人眼就看不出差别来了。效果图改进面向对象,让每个点自己计算显示位置,自己绘制 每个点的运动轨迹是一样的,只是启动时间,启动位置不

2015-08-29 17:02:20 652

原创 自定义ViewPager实现轮播效果

前言这种轮播效果多应用于展示电影海报,但是效果并不好,有些没有手势动画,更加没有fling效果。我将ViewPager的源码拷贝出来,做了修改,实现了这两个效果。一屏显示三个page,让中间一个page居中突出显示 首先我们可以设置一个page宽为ViewPager宽的一定比例,比如 0.7。然后,ViewPager在两个page之间切换是通过设置scrollX实现的

2015-08-29 12:08:19 1019

原创 可滑动关闭的对话框(二)

继续完善,希望这个控件可以变成轮子被更多的人使用。改进改变使用方式,现在可以直接继承SwipeDialog使用,更加方便。并且和系统Dialog特性保持一致,比如设置Dialog的显示、取消、关闭监听器,设置可取消、可点击窗口以外区域取消等等。增强适用性,SwipeDialog的布局支持ListView、ScrollView等

2015-08-29 11:18:01 1014

原创 可滑动关闭的对话框(一)

前言Uber大家都用过,有时候它的对话框是从顶部落下来,你可以把它推上去关闭,或者把它拽下去关闭。我觉得这种交互方式很好。符合认知,也更加便捷。用在一些非关键信息的展示很合适,比如广告。效果图原理并没有去继承Dialog,而是直接将dialog视图通过WindowManager.addView方法添加到窗口中。当然,我在dialog视图外层包了一层FrameLayout用来获取并处理触摸事件,并实现

2015-08-02 16:41:31 1795

原创 个人主页常见的头像与背景图不同步移动的下拉效果实现

我自己想出来的实现方式,而且我觉得这样实现效率最高。假设背景图比用户信息视图高x,那么将背景的顶部x/2和底部x/2隐藏起来,如图所示 下拉的时候,让背景的移动速度是内容移动速度的1/2下拉到一定程度,背景完全显示之后,让背景和内容的移动速度保持一致如何隐藏背景图的顶部和底部? 通过设置背景的marginTop为-x/2隐藏顶部,而个人资料视图下面的视图会把背景图底部x/2挡住

2015-08-02 15:16:14 1864

原创 Windows风格的Loading动画Android实现(2)

前言众所周知,为了不ANR,不可以在UI线程上执行耗时的操作。所以为了效率,也为了通用,我把计算绘制参数的操作放到工作线程中去了。参考了这篇文章。首先创建一个工作线程(workerThread),一个与workerThread关联的Handler(workerHandler),还有一个和UI线程关联的Handler(uiHandler)。在onDraw()执行结束之后,会通过workerHander

2015-07-26 21:28:11 523

原创 自己动手(二)──PullToRefresh之上拉翻页(3)

前言其实,上拉作为一个手势可以和很多动作关联,不仅仅局限于翻页。我的实现里面很多东西写的比较死,比如其实bottom view其实可以由使用者创建,bottom view在上拉过程中状态的改变也可以定制,通过addView加入到PullToRefresh容器中,这样可以提供更多灵活性。即,可以定义一个AbsBottomView的虚基类,它会有一些诸如onFinish,onRelease, onPu

2015-07-26 15:47:17 600

清理目录工具

使用说明: 把exe放在某个目录下,双击运行。当前目录下的文件(不包括文件夹)就会被移动到一个文件夹下(新文件夹以当前时间命名)。 我写它主要目的是为了清理桌面,放到桌面,运行一下,桌面上的的文件就移走,说法清爽。 注意! 不要修改exe的名称,修改的话也能用,只是exe也会被移动到新建的文件夹中。 python源码http://blog.csdn.net/fly1183989782/article/details/24868755

2014-05-02

空空如也

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

TA关注的人

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