自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(129)
  • 资源 (1)
  • 收藏
  • 关注

原创 工作中遇到的crash总结

目录async-signal-safe异常C++ 异常Objective-C访问非对象内存objc_msgSend 内部 crash访问被释放的对象SIGBUS 信号物理地址不正确物理地址未对齐SIGSEGV 信号空指针执行没有执行权限的内存向只读内存进行写操作栈溢出SIGILL执行特权模式指令执行未定义指令SIGT...

2019-06-05 20:25:43 1480

原创 无用图片扫描、删除脚本(Python)

使用Python开发检查脚本,原理是:1. 首先扫描所有特定后缀( '.png', '.jpg', 'jpeg' , '.imageset')等格式的图片文件 或 图片文件夹,获取文件名,存入 allImageFiles 数组中;2. 扫描所有代码文件,逐行分析,若有引用 allImageFiles 内图片文件文件名的字符串,则将该字符串对应的图片文件列为有用图片,存入 usedImage...

2019-06-04 21:18:09 765

原创 MVVM+RAC总结

目录一、什么是MVVM二、为什么使用MVVM三、RAC3.1 RAC的用法四、RAC与MVVM架构设计的优点五、MVVM + RAC5.1 MVVM使用指南5.2 RAC坑一、什么是MVVMMVVM(Model - View/ViewController - ViewModel)是对MVC的一种变形设计模式,解决ViewController代码臃肿、View...

2019-06-01 11:07:05 2712

原创 包大小治理总结

目录一、图片资源1.1 清理无用图片1.2清理重复图片1.3压缩图片大小二、代码瘦身2.1 找寻无用代码RealizeClass 的实现RealizeClass的调用时机如何遍历所有的类?Class & MetaClass小结这是我个人的经验总结,如有更好的意见大家一起交流哈,共同进步。为什么要管理包大小?相信iOS开发者们都知...

2019-05-29 13:39:07 669

原创 WWDC

2017 WWDC让我印象最深的就是Xcode 9的匠心、吊炸天的Core ML和VR编译和索引速度就是一切Xcode 9的编译系统是用Swift重写的,编译速度有了很大的提升,同时索引系统也使用了新的引擎,超大项目中文件夹滑动FPS能达到60,代码搜索速度可最多提升50倍(Demo里有一个上w行的文件,寻找一个文件尾部的函数,瞬间就定位到了)2018 WWDC本届W...

2019-05-27 23:41:51 239

原创 2016WWDC-App Signing

目录2016WWDC401 - What's New in Xcode App Signing存在问题1.开发者无法专注于开发2.团队合作3.provisioning profile操作繁琐3.provisioning profile通过ID引用曾经的尝试1.Xcode7免证书真机调试新的方案1.自动签名(Automatic Signing)2.定制...

2019-05-27 21:11:37 165

原创 iOS 自建通道原理总结

目录1、背景2、设计流程图1.长连通道的建立与初始化2.网络长连接通道的稳定性如何保证(1) NAT超时断开长连通道的规避策略(2) DHCP 续租断开长连通道的规避策略(3) 重试3、pushSDK与pushServer建立连接过程3.1协议设计4、通信格式4.1 监控体系1、背景目前iOS已经有原生APNs推送服务,完全有苹果公司维护。对...

2019-05-26 13:50:08 582

原创 OAuth1.0 和OAuth2.0的区别

一、为什么出现OAuth?OAuth是一个开放的标准,在移动、web平台能提供一种安全地API授权,使第三方应用不需要密码账号通过授权的方式就可以进行登录。要解决的问题:打破传统的账号密码登录登录方式,不管是对于用户还是应用提供商,都能安全保障账号数据不被泄露。二、OAuth1.0 (-2012.4.20)1请求request code 和 access token过程中,得...

2019-05-21 20:25:34 8098 1

原创 iOS APNs推送常见问题

此文章主要总结对自己在维护推送SDK过程中的经验总结。但是只针对APNs进行总结,自建通道属于公司隐私,如有不同的意见欢迎补充,大家一起探讨。一、推送消息没收到1.1 客户端排查检查设备通知设置,查看自己的应用是否打开了推送消息权限。 检查设备网络设置,有两部分原因:(1)设备网络异常,可能导致客户端在注册APNs时获取消息的标识失败,这将导致APNs服务器无法给指定设备推送消息。...

2019-05-20 14:04:55 2401

原创 MVVM架构设计文档

摘要这篇文档主要讲解MVVM架构的具体设计,分别有层级划分、层级职责和层级之间的通信,层级内的模块划分、模块职责和模块之间的通信,模块内使用的设计模式和设计模式的使用场景。作为程序设计的准则和规范,并为以后的框架改进提供参考。设计目标架构设计按优先级需要达成以下目标:层级、模块之间的低耦合性 逻辑层的复用性 逻辑层的高度灵活性,可快速应对需求变化,达到可用逻辑模块的拼装完成一个...

2019-05-12 20:12:26 2971

原创 GCD基本使用总结

1.GCD的基本使用1.1 同步执行 + 串行队列总结:所有任务都是在主线程完成的,证明了同步执行不具备开启新的线程。所有任务都是按序执行。1.2 同步执行+并发队列总结:所有任务都是在主线程中执行的,没有开启新的线程,也就是说同步不具备开启新线程的能力。虽然并发队列可以同时执行多个任务,但是当前只有一个线程,一个线程只能执行一个任务,所以这里也就不存在并发队列。...

2019-05-04 22:26:15 2070

原创 组件间通信方式

一种组件间通信方式QHOServiceManager 是我们推出的业务间通信的解决方案,方便客户端不同的业务仓库之间进行交互。解决不同业务库代码需要互相调用,但是不能直接依赖代码的问题。没有看懂?没关系,简单来说,当你想要用其他业务库的代码逻辑,却不想,或者,不能把其他业务 pod 添加到你的 podspec 时,你可能就是 QHOServiceManager 的潜在用户。问题的起因和...

2019-05-03 20:39:54 360

原创 开发中需要注意的性能优化技巧

原则 不做事情是最快的 耗时操作(IO等)放后台线程 不是立刻需要的东西使用懒加载 一些具体的技巧使用Caesium获取方法级耗时数据,并找出优化点在进入一个耗时的“重”方法之前使用轻量的 flag 判断是否需要去做使用局部变量减少方法重复调用声明类型时用 NS_ENUM,而不是 NSString及时删除无用的老代码谨慎使用 lock,通过良好...

2019-05-03 18:46:29 164

原创 iOS main之前发生了什么

目录编译预处理词法分析语法分析语义分析中间代码生成链接签名生成签名验证签名装载虚拟内存创建虚拟内存空间建立程序与虚拟内存的映射关系把 CPU 的 PC 设置为进程入口Mach-O 文件的加载Mach-O 文件格式dyld 加载一、基于DYLD_PRINT_STATISTICS 的分析分析方法编译预处理...

2019-05-01 18:58:11 300

原创 UIScrollView的Autolayout问题

UIScrollView本质上是简单的,通过frame指定了视窗的位置大小,通过contentSize指定了内容的大小(可滚动的区域)。Autolayout本质上也是简单的,通过指定相对和绝对量,控制UI组件的位置和大小。这两个本质上简单的东西碰撞到一起后,产生了可怕的火花。首先,contentSize的概念隐藏了,我们也不愿意去计算实际的size去指定scrollview的conte...

2019-04-22 09:40:42 254

原创 iOS 当前控制器

+ (UIViewController *)currentViewController{ UIViewController *frontUIViewController = nil; UIWindow *defaultWindow = [[UIApplication sharedApplication] keyWindow]; if (defaultWindow.win...

2019-03-16 18:40:41 318

原创 iOS 集合的深复制与浅复制

概念对象拷贝有两种方式:浅复制和深复制。顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针;深复制是直接拷贝整个对象内存到另一块内存中。再简单些说:浅复制就是指针拷贝;深复制就是内容拷贝。集合的浅复制 (shallow copy)集合的浅复制有非常多种方法。当你进行浅复制时,会向原始的集合发送retain消息,引用计数加1,同时指针被拷贝到新的集合。 现在让我们看一些浅复制的例子:NSA

2017-09-21 06:39:29 228

原创 二叉树中两个节点的最低公共父节点

问题描述构建一棵二叉树(不一定是二叉查找树),求出该二叉树中某两个结点的最低公共父结点。借用一张图如下: 最低公共父结点的思路递归,首先从树根开始考虑:①结点A 和 结点B 要么都在树根的左子树中;②要么都在树根的右子树中;③要么一个在左子树中,一个在右子树中。这是一个分治算法,对于情况①和②,可以继续递归分解。对于情况③属于代码第10行判断,复杂度为O(1)递归表达式可表示为:T(N)=2T(N

2017-09-20 23:41:28 904

原创 iOS中HTTPS证书验证浅析

本文来自于腾讯Bugly公众号(weixinBugly),原文地址:https://mp.weixin.qq.com/s/-fLLTtip509K6pNOTkflPQ 我是带着一系列的问题,找到了这篇文章,很好地解答我的疑惑! 1.怎么抓HTTPS的包? 2.中间人攻击是什么?解决方案? 3.https通讯的话,代码怎么实现CA证书校验? 4.CA证书校验都有哪些类型可以检验 ?本文分

2017-09-18 11:35:57 1849 1

原创 带你看看GCD

简介谈到iOS多线程,一般都会谈到四种方式:pthread、NSThread、GCD和NSOperation。其中,苹果推荐也是我们最经常使用的无疑是GCD。GCD优点GCD是一套低层级的C API,通过 GCD,开发者只需要向队列中添加一段代码块(block或C函数指针),而不需要直接和线程打交道。GCD在后端管理着一个线程池,它不仅决定着你的代码块将在哪个线程被执行,还根据可用的系统资源对这些线

2017-09-17 23:00:24 446

原创 欢迎使用CSDN-markdown编辑器

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl

2017-09-17 22:30:31 256

原创 归并排序

归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并过程: 归并: 1.比较a[i]和a[j]的大小; 2.若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i

2017-09-17 20:25:40 228

原创 dispatch_barrier_async和dispatch_barrier_sync的区别在哪呢?

先看用dispatch_barrier_sync代码: 给的图里写的是dispatch_barrier_sync,因为我们需要先看看我们熟悉的等待——sync是什么效果,直接跑起来 ,看结果如下 可以看到,确实是1、2、3号任务并发执行完了,然后再执行我们dispatch_barrier_sync中的任务,再并发执行的4、5、6号任务,当然,point3和barrier之间是有明显停顿的,截

2017-09-17 19:04:35 1487

原创 AFNetworking的二次封装

重复请求问题 为了刷新数据或者加载更多数据,用户会触发上下拉刷新,当网络状态不好的时候,用户可能会不断地去刷新,这样会触发很多个重复的网络请求,回调逻辑会触发很多次,不作处理的话,不仅会浪费用户流量,还会造成数据错乱(数据列表存在很多重复的数据)。原有的AFNetworking没有提供直接的方法解决上面的问题,所以我在AFNetworking3.0的基础上做了一层封装,github 框架架构

2017-09-15 21:48:49 573

原创 iOS常用设计模式

设计模式简短的总结一.熟悉常用的设计模式最近看了一本《Objective-C编程之道关于iOS设计模式解析》,看完之后总结一下 【对象创建】 原型模式:对一个类进行复制创建一个新的对象 工厂方法:将具体产生什么类型隐藏起来,将产生什么类型交给子类决定。适用于只有一种类型的工厂 抽象工厂方法:多个工厂实现了同一接口或继承同一个类 单例模式:一个类仅有一个实例,同时提供一个访问该唯一实例的接口

2017-09-15 13:49:34 378

原创 扩大按钮UIButton的点击范围

首先,我们得继承一个UIButton,然后重写了按钮中的pointInside方法。 - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 这个方法,使得按钮热区不够44×44大小的先自动缩放到44×44,再判断触摸点是否在新的热区内。- (BOOL)pointInside:(CGPoint)point withEvent:(

2017-09-04 15:23:46 643

原创 输出最少花费的祝福值

/*贪心算法: 按照祝福值从小到大排列 */#include <stdio.h>#include <algorithm>using namespace std;struct grand { int ai; int bi; bool operator < (const grand &A) const { //重载运算符,可用sort函数将按从小到大排列

2017-08-19 22:23:24 450

原创 二叉树遍历

/*已知前序和中序,得到后序**/#include <stdio.h>#include <string.h>struct Node { Node *lchild ; //左儿子指针 Node *rchild ; //右儿子指针 char c; //结点字符信息 }Tree[50]; //静态内存分配数组 int loc; //静态数组

2017-08-17 17:27:14 187

原创 iOS开发实战之Cookie注入

Cookie注入的使用场景:在开发中,我们常常会遇到这样一种场景:通过在一部分网络请求中注入Cookie信息让后台校验当前用户的登录状态以及用户权限在APP中打开一个需要登录用户才能看的页面,一般客户端会先判断是否登录,如果没有登录去登录。缺点每次都要判断,如果是付费内 容,还要引导用户去支付,这些都要去后台发起多个请求,去判断,增加了网络开销,如果逻辑处理的不够严谨,容易出错 Cookie的注入

2017-08-03 21:12:17 875

原创 集合深浅拷贝以及经常遇到的坑

引言根据拷贝内容的不同,分为深浅拷贝》深拷贝:指针赋值,且内容拷贝 》浅拷贝:只是简单的指针赋值苹果为什么这么设计呢?总结起来很简单:即安全又省内存。但是要理解或者避免踩一些坑,还需要看下面的介绍不得不先说到内存,又不得不说内存分区:程序底层——程序如何在RAM ROM运行,内存分配与分区 看下面图片: obj1是定义在函数外部的全局变量,处于全局区;obj2是定义在函数内的局部变量,处于

2017-08-03 20:04:25 281

原创 类方法前面为什么要用instancetype而不用id?

类方法经常出现在模型中,如下面:#import @interface LQFlag: NSObject@property (nonatomic, strong) NSString *name;@property (nonatomic, strong) NSString *dict;+(instancetype)flagWithDict:(NSDictionary *)dict;

2017-06-16 11:06:53 382

原创 MVC、MVP和MVVM的比较

自己的总结:MVC即模型--视图--控制器架构模式很好地解决了页面中数据层、视图层、业务逻辑层(控制器)之间的耦合关系。使它们得到显性的区分,这也使得层次之间的耦合度降低。我们在开发中可以不用顾忌所有需求而专注于某一层次开发,降低了开发与维护成本。因此对于大型页面系统的开发,三个层次各司其职。每一层专注于自己的事情,有利于工程化‘模块化开发并管理代码;’MVP即模型--视图--管理器:Vi

2017-06-14 14:11:05 462

原创 OC中代理和通知的概念

代理*代理设计模式的作用: * 1.A对象监听B对象的一些行为,A成为B的代理 * 2.B对象想告诉A对象一些事情,A成为B的代理*代理设计模式的总结: *如果你想监听别人的一些行为,那么你就要成为别人的代理 *如果你想告诉别人一些事情,那么就让别人成为你的代理*代理设计模式的开发步骤: *1.拟一份协议(协议名字的格式:控件名+D

2017-06-06 10:21:44 466

原创 initWithFrame、initWithCoder、awakeFromNib 和layoutSubviews

*当控件通过代码创建时,就会调用这个方法 *当控件通过代码创建时,想做一些初始化操作。应该在这个方法中执行- (instancetype)initWithFrame:(CGRect)frame{ if (self = [super initWithFrame:frame]) { [self setup]; // 添

2017-06-03 15:16:38 431

转载 相似图片搜索的原理

来源:阮一峰ruanyifeng.com/blog/2011/07/principle_of_similar_image_search.html2011年,Google把“相似图片搜索”正式放上了首页。你可以用一张图片,搜索互联网上所有与它相似的图片。点击搜索框中照相机的图标。一个对话框会出现。你输入网片的网址,或者直接上传图片,Go

2017-06-02 21:58:46 375

原创 Effective Object-C之属性

序言用Objective-C编程时,通过对象来存储并传递数据,在对象之间传递数据并执行任务的过程叫做“消息传递”。理解“属性”“属性”用于封装对象中的数据。OC对象通常把需要的数据保存为各种实例变量。实例变量一般通过“存取方法”来访问。而目前开发者可以令编译器自动编写与属性相关的存取方法。此特性引入了一种新的“点语法”,使开发者可以更为容易地依照类对象来访问存放于其中的数据。 哪些问题可以用属性来

2017-06-02 15:51:44 353

原创 Effective Objective-C笔记

1.用OC语言编写任何类几乎都要引入Foundation.h。不同于C语言的#include,OC采用的是#import,两者的区别是#import防止重复引入框架。经常出现这样的一个问题,我们在使用一个类文件时,只要知道有这个类名,不需要知道它的所有接口细节,那最好用“向前声明”—— @class 类名; 若用#import 则会引入这个类所有的细节,从而增加编译时间。 2.尽量用字面量语法

2017-06-02 11:12:43 548

原创 笔记Effective objective-C 2.0之了解Objective-C

按个人理解,Objective-C是在C语言基础上添加了面向对象的特性。另外OC不像C语言使用“函数调用”,OC使用“消息结构”。那么这两种的关键区别是什么呢?思考片刻答案:使用函数调用的语言,则由编译器决定;使用消息结构的语言,其运行时所应执行的代码由运行环境来决定,总是在运行时才会去查找所要执行的方法。实际上,编译器甚至不关心接收消息的对象是何种类型。接收消息的对象问题也要在运行时处理。,

2017-06-01 17:13:31 353

原创 OC的常见术语整理

存取方法实例变量的取值或设值方法。使用取值方法可以获取实例变量的值,使用设值方法可以设置实例变量的值,这与数据封装的方法论是一致的。Application Kit用于开发应用程序用户界面的框架,用户界面包含各种对象,如菜单、工具栏和窗口。该框架是Cocoa的组成部分,通常称为AppKit。ARC自动引用计数,用于编译器进行对象内存管理的特性。归档将对象数据转换成一种以后可恢复(未归档)的格式。数组一

2017-05-24 13:19:16 2362

原创 理解objc_msgSend的作用

在对象上调用方法是Object-C中经常使用的功能。用Object-C的术语来说,这叫做“消息传递”。消息有“名称”或“选择子”,可以接受参数,而且可能还有返回值。由于OC是C的超集,所以最好先理解C语言的函数调用方式。C语言使用“静态绑定”,也就是说,在编译期就能决定运行时所应调用的函数。以下列代码为例:#import void printfHello() { printf(

2017-05-17 22:59:06 725

ebridge.zip

写的一个Demo,有助于新手明白RN是什么,怎么用

2019-05-24

空空如也

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

TA关注的人

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