自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

哈雷的博客

Write the code, Change the World!

  • 博客(161)
  • 资源 (7)
  • 收藏
  • 关注

原创 券商们为什么必须布局小程序?

受限于合规性要求,券商在“互联网思维”这一点上历来给人慢半拍的印象。回顾券商的互联网化进程,完全收益于上一轮牛市。2013年起,证券公司互联网业务逐步试点放开,而那时的券商还只是停留在佣金战的层面,华泰证券和国金证券率先点燃佣金战的战火。这两家券商也是早期转型互联网的券商,从开户到交易都能够在券商APP上操作。真正让各家券商都意识到互联网带来商机,是在2014年牛市意味渐浓后。当年,具有互联网...

2020-04-08 21:42:53 816

原创 小程序开发对比

近年来,小程序愈发火热,许多大厂都出了小程序开发平台和小程序API,今天来简要对比一下各个小程序平台。微信小程序微信是最早提出小程序概念,也是最早做出小程序生态的。微信小程序开放平台地址是https://developers.weixin.qq.com/miniprogram/dev/,可以看出微信小程序API的文档比较规范,而且小程序api一直在迭代更新。功能也越来越多。而且利用微信的生态,...

2020-04-08 21:25:30 750

转载 Repo 批量回退到某次提交,并同步至服务器

背景最近使用组件化的工程,批量合并分支代码时,忘了拉取最新代码,导致合并出错,修改了大部分的冲突,并提交之后,才反应过来,要合并的分支没有拉取最新代码。现在的问题就来了,如何将各个组件都回退到合并分支之前的代码,并且还要撤回服务器端最后几次提交?解决方案可以执行如下命令:repo forall -c 'commitId=`git log --before "2019-09-12 07:00...

2019-09-16 10:06:46 1658

原创 iOS 应用创建APNS 和 VOIP的pem证书流程

早期的极光推送和友盟推送也是需要上传pem文件的,不过可能对接入SDK的开发者来说,要用一堆的命令生成pem文件还是有些太麻烦了,所以现在都改成了上传p12文件,输入密码的形式,这样极大的简化了开发人员使用SDK的流程。因为服务器端是自己实现的APNS和VOIP,所以每次给客户部署服务器后,对应的App都需要生成新的pem证书给服务器端,这里记录下创建pem文件的流程。1.创建Certific...

2019-04-03 20:09:08 1956 1

原创 alloc/retain/release/dealloc的底层实现(上)

要理解底层实现,需要用到如下开源代码。下载GNUstep的地址:GNUstep CoreRuntime源码objc4-750:Runtime源码objc4-750GNUstep就是使用早期的Objective-C来实现的,通过其开源的Foundation框架能否一窥NSObject的实现。为了便于理解,还是先看下GNUstep中的实现,因为GNUstep中的实现会简单一点,易于理解。GN...

2019-03-29 22:25:40 525

原创 # iOS中的KVO底层实现

KVO是Key-Value-Observer的缩写,使用的是观察者模式。底层实现机制都是isa-swizzing,就是在底层调用object_setClass函数,将对象的isa指向的Class偷偷换掉。而观察者模式就是 目标对象(被观察的对象)管理所有依赖于它的观察者对象,并在它自身的状态改变时主动通知观察者对象。而主动通知观察者对象这个实现一般都是调用观察者对象提供的接口。这样就可以将目标对...

2019-03-25 18:11:35 376

原创 iOS 中的内存管理

在讲述iOS中的内存管理之前,先介绍一下其他语言中的内存管理,其实内存管理主要讲的是堆内存的管理,因为其他类型的内存,比如栈内存、全局变量/静态区内存、常量等各种语言的内存管理都差不多。Java中的内存管理Java中的内存管理由JVM完全负责,java中的"垃圾回收器(GC)"负责自动回收无用对象占据的内存资源。这里的GC回收的都是通过new关键字创建出来的被分配到堆内存中的对象。大多编程语...

2019-03-21 02:51:05 1109

原创 __block变量存储域

将Block赋值给strong 类型的block变量,或者赋值给strong 修饰的对象类型中的block成员变量时,block会从栈复制到堆上。那__block变量会有什么变化呢?其实,当block 被从栈复制到堆上时,block中使用到的变量也会从栈赋值到堆上。当block被从栈复制到堆前后,__block变量存储域变化如下:1.block在栈上时,__block的存储域是栈,__bl...

2019-03-16 22:46:13 388

原创 Block运行时的类型以及Block是对象的验证

Block运行时的类型在用Clang命令,将block相关源代码转换为C++源码代码后。可以看到函数内的原始Block的isa 都是_NSConcreteStackBlock,但是其实际的类型会在运行时,根据实际情况变更和转换。这里用源码测试Block在实际运行场景下的类型。这里先针对函数内的block类型做一下总结:1.如果block内部没有截获任何变量,则该Block就是全局类型...

2019-03-15 00:30:21 681

原创 为什么Block超出变量作用域还可以继续存在?

Block中的存储域1.Block的类型通过前文说明可知,Block会转换为Block的结构体类型的自动变量(例如__main_block_impl_0类型的自动变量),__block 修饰的变量会转换为__block变量的结构体类型的自动变量(例如__Block_byref_count_0类型的自动变量)。所谓结构体类型的自动变量,也就是栈上生成的该结构体类型的实例。Block自动变量,即...

2019-03-10 23:21:44 495

转载 变量的声明、变量的定义、变量的初始化

变量的声明:用于向程序表明变量的类型和名字。变量的定义:用于为变量分配存储空间,还可以为变量指定初始值。变量的初始化:为变量指定初始值。广义上来说,变量的声明有两种情况:1.需要建立存储空间的声明。例如:int a,我们在声明的时候就建立的存储空间。2.不需要建立存储空间的声明。例如: extern int a,变量a 是在别的文件中定义的。这里,第一种情况是定义性声明(defin...

2019-03-10 14:07:49 9940

原创 __block 说明符的作用以及其对Clang编译器的影响

__block 不同于 __strong 和 __weak,后面两个是所有权说明符,而__block是存储域说明符,该说明符会影响变量的存储域。常见的存储域说明符还有:typedefexternstaticautoregister存储域说明符用于指定将变量值设置到哪个存储域中。例如,auto表示修饰的变量作为局部变量存储在栈中,static 表示修饰的变量作为静态变量存储在全局变...

2019-03-07 23:32:58 627

原创 Block中是如何实现截获自动变量值的呢?

我们都说block会捕获(持有)它使用到的局部变量的值,可是它是如何实现捕获自动变量的值的呢?下面依然是使用一段代码,然后用Clang进行转换,来分析其过程。1.使用Clang对比转换前后的代码转换前的main.m源码:#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) { ...

2019-03-04 00:46:10 1034

原创 Clang 是如何编译Block的?

在开始介绍Clang编译Block之前,可以先了解下Clang编译器:Xcode clang 编译器 中文The Compiler 英文原文上一篇文章说,Block 是“带有自动变量值的匿名函数”,但是看到本文中Clang将源码转换成C++源码后的内容,会发现Block的功能其实是由几个结构体、构造函数、和一个函数完成的。1.如何生成转换后的源码?我们先创建一个简单的命令行应用,来看一下...

2019-03-03 21:20:50 690

原创 iOS block简介

Block 是iOS 4 才引入的C语言扩充功能。block是什么?block 就是带有自动变量(就是局部变量)值的匿名函数。顾名思义就是带有自动变量(也就是局部变量)值的不带名称的函数。自动变量值是啥意思呢?先回顾下C语言中的函数里可能使用的变量类型:自动变量(局部变量)函数的参数静态变量(静态局部变量)静态全局变量全局变量其中,在函数的多次调用之间能够传递值的变量有:...

2019-02-16 15:59:07 2065

原创 二叉树

1.什么是二叉树?二叉树(Binary Tree)是 n(n ≥ 0)个结点点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。2.二叉树的特点每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。注意不是只有两棵子树,而是最多有。没有子树或者由一颗子树都是可以的。左子树和右子树是有顺序的,次序不能任意颠倒...

2019-02-15 20:17:22 300

原创 # iOS导航栏控制Tips

许久不写UI,对UI的很多东西都生疏了,最近使用导航栏的各种场景做一些总结。1.导航栏的显示与隐藏导航栏的显示与隐藏,分两种情况:1.从不显示导航栏的页面push到显示导航栏的页面。2.从显示导航栏的页面Push到不显示导航栏的页面。注意:1.如果导航栏不显示时,系统的侧滑返回功能无效。2.虽然侧滑返回功能无效,但是导航栏的 .interactivePopGestureReco...

2018-12-17 19:10:16 285

原创 Android 页面跳转模式

简介Android 中的页面跳转与iOS中的页面跳转非常的不同。Android中的更简单也更复杂,说其更简单是因为Android 中打开一个新的页面一般用用类似如下的代码:Intent intent = new Intent(this, MainDetailActivity.class);startActivity(intent);但是,Android中可以在AndroidManife...

2018-11-16 23:31:26 4685

原创 Android 四大组件之Activity

Activity 是安卓四大组件之一,也是最常用最重要的组件。四大组件:Activity、Service、Content provider、Broadcast Receiver。通常一个Activity表示的就是一屏(也就是App的某个界面)。Activity 相当于MVC模式中的Controller,它用来管理数据与View的联系,以及View的交互行为处理。与iOS 中的UIViewCo...

2018-10-27 23:32:15 810 1

原创 Android 自定义shape、selector、layer-list样式

本篇记录下几种常见的自定义样式。1.设置视图的圆角Android中的设置圆角跟iOS中不太一样,但是我感觉,Android自定义shape 应该类似于给视图设置一个底层背景的layer。怎么做呢?首先创建一个自定义的drawable文件,New --> Drawable resource file,使用默认的country code,创建出来的是selector,将selector改为...

2018-10-08 23:55:37 391

原创 Android 基础控件(三)

10.ScrollView当界面上要展示的内容大于一屏时,我们就会用到滚动视图或者滚动视图的子类。ScrollView 仅可以上下滚动。而HorizontalScrollView只可以左右滑动。但是滚动视图内只能有一个视图,所以一般都是将多个视图放在layout内。示例代码:<ScrollView android:layout_width="match_paren...

2018-10-06 23:35:33 237

原创 Android 基础控件(二)

本文记录一下Android中的常用的基础控件:TextView、EditText、Button、RadioButton、CheckBox、ImageView、ProgressBar、DatePicker、ScrollView、WebView、ListView。1.基类View基本所有的UI控件都继承自View,但是View是不能嵌套View的,如果想要视图之间嵌套使用,可以使用View的子类V...

2018-09-20 21:35:12 453

原创 Android基础控件之基本属性

Android中所有的UI控件都继承自View,在开始介绍View的基本属性之前,先学习一下Android是如何添加一个视图控件的。 在iOS中往某个界面上添加一个控件有两种方式: 1.使用xib或者storyboard,往可视化界面上拖一个控件(比如UIlabel,然后设置好frame和内容)即可。 2.使用代码创建一个UIlabel实例,然后调用[addSubView:]将label实例...

2018-09-16 23:18:14 1264

原创 Android学习入门

前言上一次写Android博客,还是在13年,那时候刚开始做Android项目,那时候做Andorid,还是用Eclipse(只不过是google集成了插件的版本),博客就记录了下怎么搭建Android开发环境,后面就不了了之了。而最近的一次写Android代码,还是17年基于XMPP做IMSDK,当时就很感慨Android开发环境,每一个按钮的作用和位置都已经发生了很大的变化,模拟器也变的好...

2018-09-16 23:03:52 1394

转载 iOS 实时获取当前应用消耗的CPU和内存

https://www.cnblogs.com/mobilefeng/p/4977783.html 这一遍文章对获取app 消耗的CPU和内存问题的多种方案做了对比,没有实际去测试。1 获取应用消耗的CPUfloat cpu_usage(){ kern_return_t kr; task_info_data_t tinfo; mach_msg_type_number_t

2017-12-01 16:01:19 20191

转载 iOS 中获取某个视图的截图

最近在做SDK的截图,想触发类似系统的截屏功能,找了一圈,总结一下靠谱的几种方式。 我写了个UIView 的category,将这几种方式封装和简化了一下。第一种情形截图这种是最最普通的截图,针对一般的视图上添加视图的情况,基本都可以使用。 源码:/** 普通的截图 该API仅可以在未使用layer和OpenGL渲染的视图上使用 @return 截取的图片 */- (UIImage *)

2017-11-28 19:56:28 9824 2

原创 XMPP常用协议(三)

这一篇记录与群相关的XML协议格式。 这里需要注意,我们每次登录之后,都需要获取自己的群列表,并且主动加入到群房间里,否则就不能做群操作,也不能收到群消息。12.获取自己加入的群列表关于XMPP中群组的概念,需要注意的是:它分为公开群和非公开群。当我们获取自己加入的所有群时,公开群也会被搜索出来,所以,我们创建的群必须是非公开群。 关于xmpp群的相关协议可以查看 XMPP-0045(多人聊

2017-07-24 10:08:30 1623 2

原创 XMPP常用协议(二)

这一篇主要介绍发送消息,发送和接收到的XML格式。8. 发送文本消息因为Android 中直接在Message 根目录扩展多个节点比较麻烦,所以我们这边只扩展了一个节点,然后在这个节点内部添加多个子节点来传递内容。发送消息时,如果对方离线时,body又为空,则对方上线时,并不会收到这条消息(推测Openfire服务器并未存储body为空的离线消息,一定得保证body不为空)。<message typ

2017-07-22 18:08:38 1391

原创 XMPP常用的协议(一)

最近,在用XMPP协议封装iOS和Android的IMSDK,整理了一下常用的协议内容。 其中包括上线、离线;添加好友、删除好友、同意好友申请、拒绝好友申请、为好友设置备注;发送消息(文本、图片、定位、语音);获取群列表、创建群、配置群信息、设置管理员、撤销管理员、邀请人加群、踢人、退群、解散群等等。

2017-07-22 18:06:56 7014

转载 如何让 Xcode 在读写上提速100倍?

文章转载自:http://www.jianshu.com/p/5861beb5bb75上个月参加了一场西雅图当地的线下 iOS 开发者聚会。Jeff Szuhay 作为一个有20+年开发经验的资深程序员,跟我讲了一套提高 iOS 开发效率的方法。相比于其他程序员在 App 启动时间、架构优化方面的经验,老爷子 Jeff 的优化基于硬件层面,匠心独运,极客风十足。以下是他的经验分享和我个人的实测。问题

2017-04-24 10:46:34 838

转载 atomic 和 nonatomic 有什么区别?

文章转载自:http://www.jianshu.com/p/7288eacbb1a2问题在定义 property 的时候,atomic 和 nonatomic 有何区别?

2017-04-05 17:38:57 2591

原创 算法之路(四)----汉诺塔(又称河内之塔)

汉诺塔是很简单也很经典的算法之一。 汉诺塔是根据一个传说形成的数学问题: 有三根杆子A,B,C 。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆: * 1 每次只能移动一个圆盘; * 2 大盘不能叠在小盘上面。提示:可将圆盘临时置于B杆,也可以将A杆移除的圆盘重新移动回A杆,但都必须遵循上述两条规则。 问:如何移?最少要移动多少次?

2017-03-13 14:25:28 5097

原创 Mac 下安装Maven 环境

最近折腾了一段前端,又得折腾后台,真是惨痛的经历啊! 下载了一个后台框架,本以为安装好JDK、JRE、Eclipse 后,工程就能直接跑起来,谁知竟然还要安装Maven环境,所以只能来折腾了。开发者就是得能折腾!首先是下载Maven从Maven官方地址:http://maven.apache.org/download.cgi下载最新版本apache-maven-3.3.9-bin.tar.gz。将

2017-02-23 14:37:27 23146 1

转载 Objective-C中的消息发送总结

关于OC中的消息发送的实现,在去年也看过一次,当时有点不太理解,但是今年再看却很容易理解。 我想这跟知识体系的构建有关,如果你不认识有砖、水泥等这些建筑的基本组成部分,那么我们应该很难理解建筑是怎么建造出来的吧? 学习新知识,应该也是同样的道理!资料今年再看 消息发送机制时,也翻了很多文章,本来想自己总结一遍的,但是感觉这篇 Objective-C 消息发送与转发机制原理 实在写的太好了,就直接

2017-01-17 13:30:18 1917

原创 iOS中的颜色

最近在改Bug的时候,才注意到iOS 中的颜色竟然也大有文章,特来记录一下。先说一下问题,因为某界面中有用xib实现的一个view,而这个view 只在UIColletionView的layout 里通过nib 注册使用,为这个xib设置了背景色,然后Cell也设置了背景色(用RGBA的API代码设置的颜色),这两个颜色值一样,但是实际显示出来颜色就是不一样。如下图所示 xib中的RGBA颜色从上

2017-01-09 10:33:50 3500

原创 RunLoop总结:RunLoop 与GCD 、Autorelease Pool之间的关系

如果在面试中问到RunLoop相关的知识,很有可能也会问到RunLoop与GCD、Autorelease Pool有没有关系,哪些地方用到了GCD、Autorelease Pool等。 So,本文就总结一下RunLoop与GCD和 Autorelease Pool 之间的关系,看看在RunLoop实现中,哪些地方间接或者直接使用、操作到了GCD 和Autorelease Pool。RunLoop

2016-12-21 14:00:18 7940

原创 RunLoop总结:RunLoop基础知识

没有实际应用场景,很难理解一些抽象空洞的东西,所以前面几篇文章先介绍了RunLoop的几个使用场景。 另外AsyncDisplayKit中也有大量使用RunLoop的示例。 关于实际的使用RunLoop 的案例和使用场景就不总结了,今天总结一点RunLoop的基础知识和概念。什么是RunLoop?顾名思义,它就是一个运行循环。一个RunLoop 就是一个用于处理既定工作和接收到的外来事件的事件处

2016-12-20 17:09:02 3625

转载 iOS关于时间的处理

转自:iOS关于时间的处理做App避免不了要和时间打交道,关于时间的处理,里面有不少门道,远不是一行API调用,获取当前系统时间这么简单。我们需要了解与时间相关的各种API之间的差别,再因场景而异去设计相应的机制。时间的形式在开始深入讨论之前,我们需要确信一个前提:时间是线性的。即任意一个时刻,这个地球上只有一个绝对时间值存在,只不过因为时区或者文化的差异,处于同一时空的我们对同一时间的表述或者理解

2016-12-16 09:51:09 3395

原创 RunLoop总结:RunLoop的应用场景(五)

今天要介绍的RunLoop应用场景感觉很酷炫,我们可能不常用到,但是对于做Crash 收集的 SDK可能会用得比较频繁吧。相比关于RunLoop 可以让应用起死回生,大家都听说过,可是怎么实现呢?今天我就来实际试验一下。资料sunnyxx线下分享RunLoop (这是一份关于线下分享与讨论RunLoop的视频,备用地址:https://pan.baidu.com/s/1pLm4Vf9)漫谈iOS

2016-12-15 17:28:52 4657 2

原创 RunLoop总结:RunLoop的应用场景(四)

今天要介绍的RunLoop使用场景很有意思,在做长期项目,需要跟踪解决用户问题非常有用。 使用RunLoop 监测主线程的卡顿,并将卡顿时的线程堆栈信息保存下来,下次上传到服务器。参考资料关于今天要介绍的使用RunLoop 监测主线程卡顿的资料如下: * 微信iOS卡顿监控系统 (这篇文章要首先阅读,了解有哪些情况会引起主线程卡顿,监测到卡顿后怎么处理等) * 监控卡顿的方法 (使用RunLo

2016-12-15 10:04:31 5702

SmartPush推送测试工具

一个发起推送消息的工具。可以用来测试APNS推送、VOIP推送等。

2019-04-03

getgateway

WIFI获取ip和mac地址相关工具类,用来获取WiFi的网关地址,其中 getdefaultgateway 是一个C语言文件中的方法。

2019-03-23

ChatDemo例子

一个XMPP的简单demo,包含登录、注册功能。

2015-07-20

FMDB封装以及多线程下用法

FMDB 的CURD操作的封装。 能够实现自动创建数据库,自动创建表、自动检测和添加实体类字段。 多线程下使用。

2015-07-15

FMDB的多线程操作

FMDB的两种多线程操作数据库创建表、插入、删除、更新、查询等。

2015-06-25

IOS课程表Demo

一个简易的IOS课程表demo,希望能帮到他人

2015-01-23

IOS语音通话Demo

用AudioQueue录制声音,然后进行amr编码,并封装RTP包头,其实就是在每一帧加16个字节,可以自己去掉

2014-09-27

空空如也

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

TA关注的人

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