- 博客(218)
- 资源 (17)
- 收藏
- 关注
原创 iOSApp版本升级时数据库FMDB升级
1.数据库为什么升级?当我们对已经建立好的数据库进行修改(添加字段)用户单纯的升级app用到这个字段必须升级,升级,升级!!!2.为什么我们将版本信息放入数据库而不使用UserDefaults快速存储呢?原因是你需要考虑到当你的app有不同的用户登录时,UserDefaults是所有数据共享的,你不能根据不同的用户来处理他的信息判段他的信息是否需要更新...
2019-05-16 11:33:03 2656 1
原创 iOS开发数据库《六》篇—FMDB源码解析
一、FMDB源码结构我们可以从结构上看出FMDB在共有5个文件组成,其中FMDB.h用于管理其他5个文件,下面分别讲述5个文件的用处(1)FMDatabase:代表一个单独的SQLite操作实例,数据库通过它增删改查操作;(2)FMResultSet:代表查询后的结果集;(3)FMDatabaseQueue:代表串行队列,对多线程操作提供了支持;(4)FMDatabaseAdditio...
2019-05-07 19:50:05 1378 1
原创 iOS开发数据库《五》篇—FMDB简单介绍以及高级使用
一、简单说明1.什么是FMDBFMDB是iOS平台的SQLite数据库框架FMDB以OC的方式封装了SQLite的C语言API2.FMDB的优点使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码对比苹果自带的Core Data框架,更加轻量级和灵活提供了多线程安全的数据库操作方法,有效地防止数据混乱3.FMDB的github地址https://github.com/ccgus...
2019-05-07 16:05:14 1525
原创 iOSWKWebView与HTML5的交互《二》设计方案与架构
上一篇已经讲解了WKWebView与前端交互的基本使用,本文主要讲解自己设计方案,如何做到List item耦合性增加代码的复用率减少重复代码易维护可扩展性强首先思考一个问题:一个项目中必定有很多URL请求如何如何在,每个页面必定有很多与客户端交互的...
2019-04-23 20:06:30 1240
原创 iOS多线程——GCD概念篇
iOS开发多线程篇—GCD介绍一、简单介绍1.什么是GCD?全称是Grand Central Dispatch,可译为“牛逼的中枢调度器”纯C语言,提供了非常多强大的函数2.GCD的优势GCD是苹果公司为多核的并行运算提出的解决方案GCD会自动利用更多的CPU内核(比如双核、四核)GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)程序员只需要告诉GCD想要执行什么任务...
2019-04-09 19:52:13 1403
原创 iOSRuntime(二)可复用而且高度解耦的用户统计埋点实现方案(method_exchangeImplementations)
用户统计知识:用户行为统计(User Behavior Statistics, UBS)一直是移动互联网产品中必不可少的环节,也俗称埋点。在保证移动端流量不会受较大影响的前提下,PM们总是希望埋点覆盖面越广越好。目前常规的做法是将埋点代码封装成工具类,但凡工程中需要埋点(如点击事件、页面跳转)的地方都插入埋点代码。一旦项目越来越复杂,你会发现埋点的代码散落在程序的各个角落,不利于维护以及复用...
2019-03-28 10:25:59 1642
原创 iOS数据库之一: 沙盒的详细讲解
在iOS平台上,每个app都有一个存储空间,用以存储照片、声音文件、文本、属性列表等,我们称之为沙盒。在沙盒里,app可以自己读写文件,但仅限于自己的沙盒,不可访问其他app沙盒,不可进行相互间通信,除非通过URL Scheme...
2019-03-09 15:44:04 1905
原创 ios 本地数据库存储的方式和几种方案的比较
常见的储存方式 - plist 格式文件存储 - NSUserDefaults 沙盒存储(个人偏好设置) - 文件读写存储 - 解归档存储 - 数据库存储了解缓存,先要了解iOS中沙盒机制这个概念沙盒其实质就是在iOS系统下,每个应用在内存中对应的存储空间。每个iOS应用都有自己的应用沙盒(文件系统目录),与其他文件系统隔离,各个沙盒之间相互独立,而且不能相互访问(手机没有...
2019-03-09 15:37:09 4437
原创 ios 图片资源管理的四种方式(Assets,bundle文件,Resource,沙盒文件目录下)
Assets.xcassets一般是以蓝色的Assets.xcassets的文件夹形式在工程中,以Image Set的形式管理。当一组图片放入的时候同时会生成描述文件Contents.json。且在打包后以Assets.car的形式存在,不能打开(网上有工具ThemeEngine可以打开,感兴趣的可以测试)。以此方式放入的图片并不在mainBundle中iOS 开发中一般在工程内导入两...
2019-03-08 17:54:03 25832 1
原创 ios 三种系统弹框的封装(UIAlertController,UIActionSheet,输入框)
一句代码搞定三种弹框(面向协议的编程)第一步:代码的架构看图(定义一个OutgoingServer,)我们只需要调用这个,第二步: 从OutgoingServer获得弹框+ (id<ActionSheetAlertInterfaces>)actionSheetWithTitle:(NSString *)title ...
2019-03-08 11:30:37 5361
原创 iOS开发之静态库—— 图片、界面xib等资源文件封装到.a静态库
公司的一个项目,需要做成一个.a静态库供别人调用,但是静态库中引用到了图片和xib1.打开Xcode,点击File\New\Project,选择iOS\Framework and Library\Cocoa Touch Static Library新建一个静态库工程.2.导入你的项目(包括项目里面所有的功能类和资源文件)1》对于图片,建议不要把存放图片的Assets.xcassets文件直...
2019-03-07 17:12:26 2427
原创 iOS 引用外部静态库(.a文件)时或打包.a时,Category方法无法调用。崩溃,静态库所用到的第三方不打到静态库,防止导入工程文件冲突
我的这个是MJRefresh,学习打.a包Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘-[UITableView setMj_footer:]: unrecognized selector sent to instance 0x7fa37a871000’结果这个问题如下设置:...
2019-03-05 16:26:56 2187
原创 iOS闪退的原因和方案总结
1.字典1.通过key值得到安全的value值,字符串(NSString)或数组(NSArray)数据为NUll 崩溃以下收集的崩溃原因,大家会觉得怎么也不会犯这错误,举个例子,我下面所写的 NSDictionary *dic = @{@“key”: nil}; 大部分可能认为他会崩溃,非常小心, 如果是NSDictionary *dic = @{@“key”: str} 这种写法,大家有可能...
2019-03-05 14:40:12 10426 1
原创 iOS12 iphoneXS iphoneXSMax IphoneXR 已经Xcode10 的适配总结
ios 12正式发布之后,我们也面临着一些兼容的一些问题适配,总结了以下几个方面iOS12 适配相关1.iOS 12系统版本号判断的增加: 2. iOS12新功能将释放Siri潜力 借助Shortcuts ...
2018-09-17 16:03:06 6987
原创 iOS IOS开发中各种型号的分辨率总结
iPhone:iPhone 1G 320x480iPhone 3G 320x480iPhone 3GS 320x480iPhone 4 640x960iPhone 4S 640x960iPhone 5 640x1136iPhone 5S 640x1136iPhone 5C 640x1136iPhone 6 750x1334iPhone 6 Plus 10...
2018-09-17 14:39:44 4103
转载 使用 Property Wrapper 为 Codable 解码设定默认值
本文介绍了一个使用 Swift Codable 解码时难以设置默认值问题,并利用 Property Wrapper给出了一种相对优雅的解决方式,来在 key不存在时或者解码失败时,为某个属性设置默认值。这为编解码系统提供了更好的稳定性和可扩展性。最后,对 enum类型在某些情况下是否胜任进行了简单讨论。Codable 类型中可选值的窘 (囧?) 境基础类型可选值Codable 的引入极大简化了 JSON 和 Swift 中的类型之间相互转换的难度。当我们将 Swift 类型中的一个值设定为可.
2021-12-22 11:34:16 656
原创 Swift-重写运算符
摘要基础数据的运算可以直接使用四则运算符。在 Swift 中也可以通过重写四则运算符的方式,让 struct 或者 class 创建的结构体或者对象也能像基础数据那样直接使用四则运算符。Swift 中有经常用到加、减、乘、除的操作,在代码中编写这些操作,实现功能中需要的基础计算。比如下面代码中实现的加法操作。let a = 1let b = 2let c = a + b// c = 3当遇到 struct 或者 class 中的变量做计算操作时,一般都是把属性依次拿出来计算,比如两个 C.
2021-12-22 10:20:32 376
转载 重构代码的 5 个 Xcode 技巧
作为一名开发人员,有时重构代码比写代码的时间都要多,所以知道如何重构一段代码是开发者需要掌握的一项非常重要的技能之一。它还有很多的好处,例如:有了重构思维,我们从一开始就能有意识的去编写更简洁、更安全的代码提高代码的可测试性可以更好的进行 code review...
2021-11-09 09:32:42 1087
原创 Xcode中代码注释编写小技巧
代码大家都会写,但是把注释写好却是一个技术活。下面这段话,很好的说明了写好注释的感觉:注释代码很像清洁你的厕所——你不想干,但如果你做了,这绝对会给你和你的客人带来更愉悦的体验。—— Ryan CampbellObjective-C的代码注释很久很久以前,在Xcode还可以安装插件的时代,iOSer都通过VVDocument来编写代码注释的。代码注释的风格一般都是这样的,代码出自SDWebImageManager.h/** * Controls which image should be
2021-10-21 11:20:29 1285 2
原创 Any,AnyObject,AnyClass ,元类型,和.self
前言在Swift中能表示“任意”这个概念的除了Any和AnyObject以外还有AnyClass
2021-10-19 13:56:53 1125
原创 Swift5.0 的 Runtime 机制浅析
导读:你想知道Swift内部对象是如何创建的吗?方法以及函数调用又是如何实现的吗?成员变量的访问以及对象内存布局又是怎样的吗?这些问题都会在这篇文章中得到解答。为了更好的让大家理解这些内部实现,我会将源代码翻译为用C语言表示的伪代码来实现。前言Objective-C语言是一门以C语言为基础的面向对象编程语言,其提供的运行时(Runtime)机制使得它也可以被认为是一种动态语言。运行时的特征之一就是对象方法的调用是在程序运行时才被确定和执行的。系统提供的开放接口使得我们可以在程序运行的时候执行方法替换.
2021-10-14 14:28:31 1703
原创 iOS客户端安装包大小优化
优化方向AppStore 对包大小提供的优化支持对于在 AppStore 发布的包,苹果也为 App 提供了很多优化方式,而这些是通过企业证书签发的包无法做到的。当 App 构建完安装包之后上传到 AppStore Connect 后, AppStore Connect 会根据设备、系统来创建其变体(variant)以适配不同的设备,用户从 App Store 中下载到的安装包时候,只下载自己设备用到变体。变体之间的差异取决于设备的处理器架构(arm64, armv7)、屏幕分辨率(2x, 3x)、
2021-10-08 13:27:59 4626
原创 Swift 泛型底层实现原理
Swift 是如何管理协议类型与泛型类型的生命周期与方法调用?协议类型在内存中的存储形式是 Extential Container,Extential Container 占 5 个内存单元(也称 词),其作用如下:3 个词作为 Value Buffer。1 个词作为 Value Witness Table 的索引,主要用于管理生命周期。1 个词作为 Protocol Witness Table 的索引,主要用于管理方法调用。泛型类型由于在调用时能够确定具体的类型,所以不需要使用 Ext.
2021-10-07 15:28:28 875
原创 Swift之深入解析可选类型Optional的底层原理
Optional 简介可选类型伴随着Swift诞生,在原有的Objective-C语言中不存在,究其原因,是因为Swift是类型安全的语言,而OC则是弱类型语言,OC中 str字符串既可以是nil,也可以是字符串,而Swift中,这两种状态是不能同时存在的。首先我们先看下Objective-C与Swift语言对于可选nil的不同理解:Objective-C中的nil:表示缺少一个合法的对象,是指向不存在对象的指针,对结构体、枚举等类型不起作用(会返回NSNotFound)Swift中的nil:表
2021-10-05 15:24:31 2684
原创 Swift之深入解析访问控制权限
简介概念访问控制可以限定其他源文件或模块中代码对你代码的访问级别。你可以明确地给单个类型(类、结构体、枚举)设置访问级别,也可以给这些类型的属性、函数、初始化方法、基本类型、下标索引等设置访问级别。协议也可以被限定在一定的范围内使用,包括协议里的全局常量、变量和函数。访问控制基于模块与源文件。模块指的是以独立单元构建和发布的 Framework 或 Application。在 Swift 中的一个模块可以使用 import关键字引入另外一个模块。源文件是单个源码文件,它通常属于一个模块
2021-10-03 16:13:20 493
原创 iOS-NSUserDefaults详解
1.官方介绍1.1 官方文档NSUserDefaultsAn interface to the user’s defaults database, where you store key-value pairs persistently across launches of your app.用户默认数据库的接口,您可以在应用程序的启动过程中持久存储键值对。当系统调用[[NSUserDefaults standardUserDefaults] setObject:@"" forKey:@"
2021-10-03 14:44:36 1157
原创 Swift:为String、Array、Dictionary添加isNotEmpty属性
前言想要为Swift的String、Array、Dictionary这几种常见类型,添加一个isNotEmpty属性。灵感来源于Dart中对于判断数组不为空有一个isNotEmpty属性:final array = [1, 2, 3, 4];print(array.isNotEmpty);Dart有,Swift也可以有啊。直接明了版本最直接明了的版本当然就是分别给String、Array、Dictionary写分类,在分类中添加一个只读计算属性isNotEmpty即可。String+Ext
2021-09-29 13:46:38 352 2
原创 Socket 是什么? epool 为什么用红黑树?
Socket 对象负责提供通信能力,并处理底层的TCP连接/UDP连接,Socket 还是一种文件,准确来说是一种双向管道文件。当一个客户端连接到服务端的时候,操作系统会创建一个客户端Socket的文件然后操作系统将这个文件的描述写入服务端程序创建的服务端的Socket 文件中,服务端的Socket文件,是一个管道文件,读取这个文件的内容,就相当于从管道中取走 一个客户端文件描述符。服务端的Socket 文件相当于一个客户端Socket的目录,线程可以通过操作拿走客户端文件描述符。,拿到描述符
2021-09-03 19:52:13 349
原创 从底层分析一下存在跨进程通信问题的 NSUserDefaults 还能用吗?
前言字节团队最近分享的 iOS 稳定性问题治理:卡死崩溃监控原理及最佳实践 提到:NSUserDefaults 底层实现中存在直接或者间接的跨进程通信,在主线程同步调用容易发生卡死。随之而来的问题就是:NSUserDefaults 还能用吗?经过对底层分析后,笔者的研究结论是:可以在理解 NSUserDefaults 的特性后再使用。一、NSUserDefaults 是什么?NSUserDefaults 是 iOS 开发者常用的持久化工具,通常用于存储少量的数据示例:NSUserDefault
2021-09-02 18:49:46 832
原创 离屏渲染&图形渲染的流程
图形渲染的流程iOS图形渲染的技术栈APP通过Core Graphics ,Core Animation ,Core Image 等框架进行可视化的绘制,这些框架相互依赖,并通过OpenGL ES /Metal 调度GPU进行视图的渲染最终显示在屏幕上。UIKit1.UIKitk框架提供一系列的Class(类)来建立和管理iPhone OS应用程序的用户界面( UI )接口、应用程序对象、事件控制、绘图模型、窗口、视图和用于控制触摸屏等的接口。2.开发者一般直接使用UIKit进行视图的布局和对用
2021-09-01 21:58:08 623
原创 swift -判断两个链表相交
import UIKitclass ListNode{ var val:Int var next:ListNode? init( val:Int ) { self.val = val self.next = nil } }class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLo
2021-09-01 17:44:51 200
原创 为什么说 HTTPS 比 HTTP 安全? HTTPS 是如何保证安全的?
导语签名和公钥一样完全公开,任何人都可以获取。但这个签名只有用私钥对应的公钥才能解开,拿到摘要后,再比对原文验证完整性,就可以像签署文件一样证明消息确实是你发的。什么是HTTP我们了解到 HTTP 在通信过程中,存在以下问题:通信使用明文(不加密),内容可能被窃听不验证通信方的身份,因此有可能遭遇伪装而 HTTPS 的出现正是解决这些问题,HTTPS 是建立在 SSL 之上,其安全性由 SSL 来保证SSL 保证HTTPS安全在采用 SSL 后,HTTP 就拥有了 HTTPS 的加密、
2021-09-01 11:06:59 573 1
原创 UI相关面试题
Bounds,FrameBounds,Frame根本区别frame有origin和sizeorigin决定自己的位置(位置是相对于父控件来说的(父控件左上角为坐标原点0,0))size决定自己的大小那么bounds的origin和size就是相对于自己来说的(自己的左上角为坐标原点0,0)是自己的子控件的位置相对于自己来说的.每个控件都有自己的frame和boundsframe决定自己在父控件(爸爸)中的位置和大小bounds决定子控件(儿子)在自己内部的位置和大小利用Bo
2021-08-31 12:35:28 403 1
原创 如何使用UIKit来实现导航功能(路由方案)
原ViewController 必须直接依赖目标ViewController这样会导致模块之间相互依赖如图所示路由方案解决各个模块之间的导航问题路由模块路由模块由两个AppRouting(protocol)和AppRouter(class)组成AppRouting 协议定义了路由模块的接口,protocol AppRouting { func register(path: String, navigator: Navigating) func route(to .
2021-08-26 15:54:44 269
原创 组件化通讯方案
URL路由目前iOS上大部分路由工具都是基于URL匹配的,或者是根据命名约定,用runtime方法进行动态调用这些动态化的方案的优点是实现简单,缺点是需要维护字符串表,或者依赖于命名约定,无法在编译时暴露出所有问题,需要在运行时才能发现错误。URL路由方式主要是以蘑菇街为代表的的MGJRouter其实现思路是:App启动时实例化各组件模块,然后这些组件向ModuleManager注册Url,有些时候不需要实例化,使用class注册当组件A需要调用组件B时,向ModuleManager传
2021-08-25 18:27:44 242
Base64Convert.app.zip
2020-01-07
Runtime(统计埋点)
2019-03-28
静态库打包shellcmd 文件
2019-03-22
swift_新手引导页
2018-10-19
OC-添加新手引导页
2018-10-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人