iOS强制使用系统键盘

1
//强制使用系统键盘
2
- (BOOL)application:(UIApplication *)application shouldAllowExtensionPointIdentifier:(NSString *)extensionPointIdentifier {
3
        if ([extensionPointIdentifier isEqualToString:@"com.apple.keyboard-service"]) {
4
                return NO;
5
          }
6
      return YES;
7
}

移动端开源项目-iOS


项目 公司 项目简介 项目地址
DoraemonKit 滴滴出行 滴滴开发的一款功能齐全的客户端(iOS、Android)研发助手 https://gitee.com/didiopensource/DoraemonKit
DynamicCocoa 滴滴出行 滴滴 App 架构组自研的 iOS 动态化方案,可以让现有的 Objective-C 代码转换生成中间代码(JS),下发后动态执行 https://github.com/DynamicCocoa/DynamicCocoa
NMessenger eBay 是一个快速,轻量级的信息组件,在 AsyncDisplaykit 上构建并用 Swift 编写。开发人员可以固定地实现 60FPS 滚动和具有丰富内容组件的平滑过渡。 https://github.com/eBay/NMessenger
SparkChamber eBay 是一个用于 iOS 的轻量级异步触发动作框架,旨在用于自动化分析、跟踪和日志记录。 https://github.com/eBay/SparkChamber
SVNetworking eBay 一个 iOS 上用于加载远程资源的开发包,使用 key-value 观察方式进行设计。 https://github.com/eBay/SVNetworking
EBNObservable eBay 实现了一个可观察的 Key-Value 集合,基于 Block 方式实现。 https://github.com/eBay/EBNObservable
BugHunt-iOS Esty 是一个嵌入式模块,允许你简单的制作 Bug 报告,发送测试用例给你的用户,并且跟踪每个用户的 bug 报告 https://github.com/etsy/BugHunt-iOS
Sonar(flipper) Facebook Sonar 是一个用于调试 iOS 和 Android 移动应用的平台,通过一个简单的界面,开发者可以可视化地审查和控制其 APP,除了可以直接使用,Sonar 还支持使用插件 API 进行扩展。 https://github.com/facebook/flipper
FBMemoryProfiler Facebook FBMemoryProfiler是Facebook开源的一款用于分析iOS内存使用和检测循环引用的工具库。 https://github.com/facebook/FBMemoryProfiler
fishhook Facebook fishhook 是一个非常简单的库,它允许支持在 iOS 上的模拟器和设备运行Mach-O,并提供动态绑定服务。此功能类似在OS X 系统上使用的 DYLD_INTERPOSE 功能。你可以通过使用 fishhook 实现呼叫/跟踪功能(如:auditing for double-close issues with file descriptors)。 https://github.com/facebook/fishhook
clang-as-ios-dylib Facebook 是一个从 Xcode 中建立 iOS 动态库 的方法。它可以直接在 Xcode 中建立 iOS 动态库(iOS dylibs),而不需要在安装 Xcode 时候进行修改。使用起来很方便 https://github.com/facebookarchive/clang-as-ios-dylib
FBFetchedResultsController Facebook FBFetchedResultsController 是 NSFetchedResultsController 的嵌入式替代品,它能在 NSFetchedResultsController 无法工作的父/子目录下工作 https://github.com/facebookarchive/FBFetchedResultsController
Chisel Facebook Chisel 是一个 LLDB 指令集合,用户辅助 iOS 应用查错 https://github.com/facebook/chisel
ComponentKit Facebook 一个受 React 启发的 iOS 视图框架,它带来一个构建 UI 声明的方法 https://componentkit.org
React Native Facebook ReactNative 可以基于目前大热的开源JavaScript库React.js来开发iOS和Android原生App。而且React Native已经用于生产环境——Facebook Groups iOS 应用就是基于它开发的。 http://www.reactnative.com
Pop Facebook Facebook 推出的一个可扩展的 iOS 和 OS X 动画框架 https://github.com/facebook/pop
Tweaks Facebook Facebook 发布的一款 iOS 应用测试工具。这款应用框架允许iOS开发者在该应用上进行测试并做实时更改,让微调更加便捷,开发者无需改变代码即可尝试多种选项。 https://github.com/facebook/Tweaks
KVOController Facebook Key-value 的监控是一个 MVC 应用中非常有用的技术。KVOController (来自 facebook)构建了一个基于 Cocoa 的 time-tested key-value 监控实现,提供简单方便、线程安全的 API。 https://github.com/facebook/KVOController
GeoFire for iOS Firebase GeoFire 是一个开源的用来存储和查询定位信息的库,简化了使用字符串键来存储位置信息。这些查询是实时的。 https://github.com/firebase/geofire-objc
FLAnimatedImage Flipboard FLAnimatedImage 是 iOS 的一个渲染 Gif 动画的引擎 https://github.com/Flipboard/FLAnimatedImage
FLEX Flipboard FLEX (Flipboard Explorer) 是 iOS 开发的应用内调试和探测工具集。运行的时候,FLEX 提供一个浮动在应用之上的工具栏,用户可以查看和修改应用的每一个地方。 https://github.com/Flipboard/FLEX
Archimedes github 是Cocoa和 Cocoa Touch 的几何函数 https://github.com/github/Archimedes
GTXiLib Google GTXiLib 是 Google 开源的 iOS 专用自动化测试框架,用于帮助开发者打造无障碍 App 。 https://github.com/google/GTXiLib
EarlGrey Google iOS UI 测试自动化框架 https://github.com/google/EarlGrey
Flutter Google Flutter 是一种新型的方式,用于创建高性能、跨平台的移动应用。由 Google 的工程师团队打造。Flutter 针对当下以及未来的移动设备进行优化,专注于 Android and iOS 低延迟的输入和高帧率。 https://flutter.dev
LayoutKit Linkedin LayoutKit 是一个高性能的iOS应用视图布局库。 https://github.com/linkedin/LayoutKit
Selene Linkedin Selene 是一个 iOS 库,用于在后台调度任务的执行。 https://github.com/linkedin/Selene
LIExposeController Linkedin LIExposeController是一个新的iOS应用程序的导航模式 https://github.com/linkedin/LIExposeController
WinObjC Microsoft WinObjC 是 Windows 开源的 Winodws 到 iOS 的“桥梁”。Windows Bridge for iOS (WinObjC) 为 Visual Studio/Windows 提供一个 Objective-C 开发环境。此外,WinObjC 提供对 iOS API 兼容的支持。 https://github.com/Microsoft/WinObjC
voice-web Mozilla 开源语音识别采集库.这是一个 Web,Android 和 iOS 应用程序 https://voice.mozilla.org/zh-CN
PINRemoteImage Pinterest PINRemoteImage 是一个快速无死锁的 iOS 并行图像下载和缓存库。 https://github.com/pinterest/PINRemoteImage
PivotalCoreKit Pivotal PivotalCoreKit 是 iOS 项目的常见开发包。它能够让你的应用程序看起来更加的漂亮,且不需要你在项目中重新编写相同的代码。它有几个不同的功能。但最主要的功能是能够帮助开发者们在 iOS 应用程序中测试驱动。 https://github.com/pivotal-legacy/PivotalCoreKit
Cedar Pivotal Cedar 是 Objective-C 上 BDD 风格的单元测试框架 https://github.com/cedarbdd/cedar
MMKV 腾讯 MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。 https://github.com/Tencent/MMKV
GT 腾讯 GT(随身调)是 APP 的随身调试平台,它是直接运行在手机上的“集成调试环境”(IDTE, Integrated Debug Environment)。 https://github.com/Tencent/GT
LKImageKit 腾讯 LKImageKit 是腾讯开源的一个高性能的图片框架,包括了图片控件,图片下载、内存缓存、磁盘缓存、图片解码、图片处理等一系列能力。合理的架构和线程模型,并特别针对不同场景进行优化,能充分发挥硬件的性能。 https://github.com/Tencent/LKImageKit
OOMDetector 腾讯 OOMDetector 是腾讯开源的一个 iOS 内存监控组件,应用此组件可以帮助你轻松实现 OOM 监控、大内存分配监控、内存泄漏检测等功能。 https://github.com/Tencent/OOMDetector
MLeaksFinder 腾讯 MLeaksFinder 是腾讯开源的 iOS 平台的自动内存泄漏检测工具,引进 MLeaksFinder 后,就可以在日常的开发,调试业务逻辑的过程中自动地发现并警告内存泄漏。 https://github.com/Tencent/MLeaksFinder
Appecker 腾讯 Appecker 是一款专门为 iOS 系统系统定制的的自动化测试框架。 https://github.com/TencentOpen/Appecker
WCDB 腾讯 WCDB 是腾讯开源的一个高效、完整、易用的移动数据库框架,基于SQLCipher,支持 iOS、macOS 和 Android。 https://github.com/Tencent/wcdb
Mars 腾讯 Mars 是微信官方的终端基础组件,是一个使用 C++ 编写的业务性无关、平台性无关的基础组件。目前已接入微信 Android、iOS、Mac、Windows、WP 等客户端。 https://github.com/Tencent/mars
QT4i 腾讯 iOS 开发自动化测试工具 https://github.com/Tencent/QT4i
CocoaSPDY Twitter CocoaSPDY 是 Twitter 推出的为 iOS 和 OS X 开发的 SPDY 开发包。 https://github.com/twitter/CocoaSPDY
TwUI Twitter TwUI 是一个支持硬件加速的 Mac 的 UI 框架 https://github.com/github/twui
RIBs Uber RIBs 是 Router、Interactor 和 Builder 的简称,是 Uber 许多移动端应用背后的跨平台架构。 https://github.com/uber/RIBs
YMCache Yahoo YMCache 是 iOS 和 Mac OS X 的轻量级对象缓存解决方案, 设计用于高度并行访问场景。 https://github.com/yahoo/YMCache

常见的几种编码


Unicode编码

Unicode 是基于国际标准化组织(International Organization for Standardization,简称ISO)所制定的 ISO/IEC 10646 ,即通用字符集(Universal Character Set,简称 UCS)的标准来发展,在1991年首次以书本的形式(The Unicode Standard)对外发布。 Unicode 的编码方式与 ISO 10646 的通用字符集(UCS)概念相对应,使用16位编码空间。16位Unicode字符构成基本多文种平面(Basic Multilingual Plane,简称BMP),最多可以表示65536个字符。基本满足各种语言的使用。最新的 Unicode 版本定义了16个辅助平面,两者合起来达到32位编码空间,可以涵盖一切语言所用的符号。目前辅助平面的工作主要集中在第二和第三平面的中日韩统一表意文字中。

GB2312 编码

GB 2312-80 编码是中华人民共和国国家标准汉字信息交换用编码,全称《信息交换用汉字编码字符集基本集》标准号为GB 2312-80(GB是“国标”二字的汉语拼音缩写),由中华人民共和国国家标准总局发布,1981年5与1号发布,1981年10月1日实施。它是一个简化字汉字的编码,通行于中国大陆地区及海外使用简体中文的地区(如新加坡等)。 GB 2312-80 收录简化汉字及一般符号、序号、数字、拉丁字母、日文假名、希腊字母、俄文字母、汉语拼音符号、汉语注音字母、共7445个图形字符。其中汉字以外的图形字符682个,汉字6763个。 GB 2312-80 把收录的汉字分成两级。第一级汉字是常用汉字,计3755个,置于1655区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字,计3008个,置于5687区,按部首/笔画顺序排列。字音以普通话审音委员会发表的《普通话异读词三次审音总表初稿》(1963年出版)为准,字形以中华人民共和国文化部、中国文字改革委员会公布的《印刷通用汉字字形标》(1964年出版)为准。

GBK编码

GBK 编码标准,全称《汉字内码扩展规范》(GBK),英文名称 Chinese Internal Code Specification,中华人民共和国全国信息技术标准化技术委员会1995年12月1日制定,国家技术监督局标准化司、电子工业部科技与质量监督司1995年12月15日联合以技监标函[1995]229号文件的形式,将它确定为技术规范指导性文件,发布和实施。这一版的GBK规范为1.0版。GB即“国标”,K是“扩展”的汉语拼音第一个字母。 GBK向下与GB 2312编码兼容,向上支持 ISO 10646.1 国际标准,是前者向后者过度过程中的一个承上启下的标准。 GBK共收录21886个汉字和图形符号,其中汉字(包括部首和构件)21003个,图形符号883个。

GB 18030编码

GB 18030有两个版本:GB 18030-2000和GB 18030-2005. GB 18030-2000是GBK的取代版本,它的主要特点是在GBK的基础上增加了CJK统一汉字扩充A的汉字,GB 18030-2005的主要特点是在GB 18030-2000基础上增加了CJK统一汉字扩充B的汉字。 GB 18030-2000,全称《信息技术 信息交换用汉字编码字符集 基本集的扩充》,中华人民共和国信息产业部电子工业标准化研究所起草,由国家质量技术监督局于2000年3月17号发布。GB 18030-2000共收录27533个汉字。 GB 18030,全称:国家标准 GB 18030-2005《信息技术 中文编码字符集》,是中华人民共和国现在最新的内码字符集,是GB 18030-2000的修订版。GB18030-2005 共收录汉字70244个。现行版本为国家质量监督检验总局和中国国家标准化管理委员会于2005年11月8日发布,2006年5月1日实施。此规格为在中国境内所有软件产品支持的强制规格。

BIG 5字符集

BIG-5 码是通行于台湾、香港地区的一个繁体字编码方案,俗称“大五码”。 BIG-5 码收录13468个符号和汉字,符号408个,汉字13060个,分为常用字和次常用字两部分,各部分中的汉字按照笔画/部首排列。其中:常用字5401个,次常用字7659。

GB/T 12345编码

GB/T 12345-90 编码全称《信息交换用汉字编码字符集 辅助集》,标准号为GB/T 12345-90,1990年6月13日发布,1990年12月1日实施,是一个关于繁体字的编码标准。所谓“辅助集”,是与“基本集”(GB2312-80)相对应而言。即:GB/T 12345 是与GB2312相对应的图形字符集。原则上,本字符集是将GB2312中的简化字用相应的繁体字替换而成。因此,这些替代的繁体字具有与被替代的简化字相同的编码;未曾简化的汉字以及非汉字图形字符,仍是GB2312中的汉字和图形字符,并具有与之相同的编码。 GB/T 12345-90 共收录7583 个图形字符。汉字以外的图形字符716个,汉字6866个,其中一级汉字3755个,二级汉字3008个,增补汉字103个。 关于繁体字替换简化字的原则,GB/T 12345 注明:“本标准原则上按照《简化字总表》中所列繁体字与简化字的对应关系进行替换。”《简化字总表》由中国文字改革委员会1964年5月发表,后经国家语言文字工作委员会作个别修改,国务院1986年6月4号批准发表。

748编码

748编码仅用于方正软件和系统

移动定位分析


1.定位原理

1).定位服务-Location Based Service 简称LBS

确定移动设备的和用户坐在位置的地理位置,提供与位置信息相关的信息服务

2).定位技术标准

a、 3GPP
3GPP TS 44.031 无线资源定位协议 (RRLP)支持A-GPS,A-GNSS,E-OTD,混合网络
3GPP TS 25.331 无线资源控制协议 (RRC)额外支持IPDL-OTDOA(基于下行链路空闲周期测量到达时间差法)
3GPP TS 36.335 LTE 定位协议 (LPP) 额外支持ECIP,A-GNSS+OTDOA混合定位技术
b、3GPP2
双模式扩频系统的定位服务标准—辅助信息采集和星厉(基于手机定位模式)
c、OMA
基于用户面的定位业务(通过移动网络数据通道来传递定位信息)
d、室内定位标准
各个厂商出现的Wi-Fi,蓝牙,ZigBee等近距离无线技术定位,为了解决室内定位问题。

3).常见的定位技术

室外定位:GPS,A-GPS,北斗定位,Glonass,基站定位,欧盟的伽利略定位系统
室内定位:Wi-Fi, 射频标签(RFID), ZigBee,蓝牙(BT),超宽带无线点(UWB)

4).ios 设备定位发展历程

最早期的iPhone只支持 手机基站定位, 之后通过iOS软件升级引入了 WIFI定位, 而从iPhone 3G开始, iPhone手机就通过内置GPS处理芯片, 支持 GPS卫星定位 (准确地说, 应该是AGPS, 即:辅助GPS). 从iPhone 4开始,GPS换用了精确度更高,耗电更少的,灵敏度更高的芯片,而从iPhone4s和new iPad 3G版开始,增加了对俄罗斯GLONASS卫星定位系统的支持

5).ios 中使用到的定位方式

a、卫星定位(1)A-GPS卫星定位:iPhone 3G+,3G/4G版的iPad 以后都支持(2)Glonass卫星定位 主要用于导航功能b、手机基站定位同GPS卫星定位,即iPhone 3G,3G/4G版的iPad以后都支持c、WIFI定位所有iOS设备,包括Mac电脑也支持。

2.基站定位

1)基本原理

每个手机基站都有一个ID标识符,插上sim卡的手机或其他终端可以搜集周围所有收到信号的基站和其ID,查询定位服务器可知基站位置。再通过计算基站信号传播到终端的角度、时间和强度等信息,就可以确定终端的位置。

基站定位.png

2)常见基站定位技术

基站定位技术分为简单型基站定位和增强型定位,简单型基站定位通常就是单基站定位,增强型基站定位需要手机给定位平台传递信号时延,信号强度,信号角度信息来实现更加精确的定位。
a、CELL-ID 单基站定位
b、TOA/TDOA/OTDOA 通过检测信号到达3个或若干基站时间差进行定位
c、AOA 到达两基站的信号入射角度进行定位
d、基于场强定位,一般通过计算3个基站半径范围内信号场强进行定位
e、AFLT 利用导频信息确定手机导至少三个基站的距离差,根据三角定位计算出手机位置

3)基站定位条件

a.有基站信号
b.手机处于sim卡注册状态(飞行模式下开wifi和拔出sim卡都不行)
c.联网,需要基站位置数据包

4)iOS无网基站定位

传统的基站定位需要连接云端服务器,产生网络流量,苹果在iO系统中,在无网情况下,不用上网也能通过这些本地基站信息定位到用户位置,但这个误差范围更大,在10公里到50公里。
S 4开始对其进行了优化,预先将一些重要基站提前存储在iOS

5)优点

对使用环境要求很小,无论是室内还是室外,只要基站信号覆盖的地方都能完成定位,定位成功率较高

6)缺点

定位精度较低,误差一般在500米~几公里

3.GPS定位

1)原理

GPS全球定位系统由空间系统,地面系统和用户系统组成。GPS空间系统由24颗卫星组成,运行周期12h,卫星均匀分布在6个轨道面上,轨道倾角55度。卫星的分布在全球的任何地方,任何时间都可以观测到4颗以上的卫星。
地面控制由1个主控站,5个全球监测站和3个注入站组成,监测站配有精密的铯钟(原子铯钟,精密计时工具)和能够连续测量到所有可见卫星的接收机,监测站讲取得的卫星观测数据传递到主控站。主控站从各个监测站收集更总数据,计算出卫星的轨道和时钟参数,然后将结果送到3个地面控制站。地面中之战在每颗卫星运行至上空时,把这些导航数据及主控站指令注入到卫星。
用户设备部分就是GPS信号接收机,主要就能捕获到按一定卫星截止角所选择的待测卫星,接受和调解卫星参数,进行定位计算。

GPS启动后搜索卫星的时间比较多,一般需要2分钟左右(俗称冷启动)
冷启动包括GPS初次使用,GPS电池耗尽,关机状态移动1000公里以上,持续关机4小时以上

GPS卫星系统组成.png

2)AGPS

AGPS是Assisted Global Positioning System辅助全球定位系统的缩写,是手机开始内置GPS芯片以后发展起来的技术。AGPS定位时,必须有GPS模块存在,如果没有GPS模块,这种定位是不起什么作用的。
iOS中的使用的就是AGPS方式定位,AGPS就是利用网络,首先将基站定位或者WIFI定位获得的大概位置发到远程服务器,有服务器进行查询和计算,得出这个位置下当前卫星信息,反馈给iOS设备,iOS设备就可以直接用这些信息来接受卫星信号,不用自己去扫描分析了。这样可以极大提高定位速度,将初次定位时间缩短到1~2秒完成。

3)定位条件

移动设备需要GPS芯片,AGPS需要联网

4)优点

精度高,误差小, AGPS定位速度快,精度最好能达到10m左右

5)缺点

GPS耗电最大,速度慢, AGPS还需要联网 ,比起GPS,定位速度快
GPS受天气和地理位置影响因素较大

4.WiFi定位

1)原理

和基站定位原理差不多, iOS设备(或者Mac电脑)通过无线网卡手机周围所有的WIFI热点(不需要连接上,只需要有信号就行),获得它们的MAC地址,然后到苹果云端服务器查询这个热点是否已经登记,登记的话它的位置是多少,最后通过计算(多个热点折中)得到当前位置并返回给用户。只要收到手机信号的地方都可以基站定位,所以室内室外一样。

2)iOS中的无网WIFI定位

传统的WIFI定位需要网络,但是iOS对其进行了优化,可以实现无网WIFI定位。原理时iOS设备在您有网络连接时,会大致定位出您的位置,并自动下载您所在地区周围(几个街区宽度或者更多)所有的WIFI热点的信息到本地。之后,当您在周围行走并WIFI定位的时候,即使没有网络,iOS照样可以利用之前下载的WIFI热点信息定位出您的位置。

3)定位条件

a、必须开启wifi,无论是否连接某一个热点。
b、手机必须能上网,移动数据或者wifi联网皆可。

4)优点

a、定位精度高,wifi密集人流多的地方相当精确,精度大概在几十米;
b、速度快;
c、周围的wifi即使连接不上也能定位

5)缺点

a、没有打开wifi就不能定位。
b、必须处于联网状态。

5.iOS中定位执行

iOS设备能提供3种不同途径进行定位:Wifi, 蜂窝式移动电话基站, GPS卫星。
iOS 不像Android系统在定位服务编程时,可以指定采用哪种途径进行定位。iOS的API把底层这些细节屏蔽掉了,开发人员和用户并不知道现在设备是采用 哪种方式进行定位的,iOS系统会根据设备的情况和周围的环境,采用一套最佳的解决方案。这个方案是这样的,如果能够接收GPS信息,那么设备优先采用 GPS定位,否则采用Wifi或蜂窝基站定位,在Wifi和蜂窝基站之间优先使用Wifi,如果无法连接Wifi才使用蜂窝基站定位。

算法中的大O表示法


1.算法概念

计算机科学中的算法指的就是计算机执行的指令。

算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤来执行一个指定的任务,如计算职工的薪水或打印学生的成绩单。

一般地,当算法在处理信息时,会从输入设备或数据的存储地址读取数据,把结果写入输出设备或某个存储地址供以后再调用。

1
         -----------       
2
输入 --> |   算法    | --> 输出
3
         -----------

算法的核心是创建问题抽象的模型和明确求解目标,之后可以根据具体的问题选择不同的模式和方法完成算法的设计。

2. 时间复杂度

算法的时间复杂度是指算法需要消耗的时间资源。

一般来说,计算机算法是问题规模n 的函数f(n),算法的时间复杂度也因此记做:

1
T(n) = O(f(n))

算法执行时间的增长率与f(n) 的增长率正相关,称作渐近时间复杂度(Asymptotic Time Complexity),简称时间复杂度。

3. 空间复杂度

算法的空间复杂度是指算法需要消耗的空间资源。

其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。

同时间复杂度相比,空间复杂度的分析要简单得多。

4. 大 O 表示法

  • 什么是大 O 表示法?
    我们常常会听到有人说,“这个算法在最糟情况下的运行时间是 O(n^2) 而且占用了 O(n) 大小的空间”,他的意思是这个算法有点慢,不过没占多大空间。
    这里的 O(n^2)O(n) 就是我们通常用来描述算法复杂度的大 O 表示法。
    大 O 表示法能让你对一个算法的运行时间占用空间有个大概概念。

  • 大 O 表示法怎么看?怎么用?
    假设一个算法的时间复杂度是 O(n),n 在这里代表的意思就是数据的个数。举个例子,如果你的代码用一个循环遍历 100 个元素,那么这个算法就是 O(n),n 为 100,所以这里的算法在执行时就要做 100 次工作。

  • 大O符号是关于一个算法的最坏情况的。比如说,你要从一个大小为 100 的数组(数组中存的都是数字)中找出一个数值等于 10 的元素,我们可以从头到尾扫描一遍,这个复杂度就是 O(n),这里 n 等于 100,实际上呢,有可能第 1 次就找到了,也有可能是第 100 次才找到,但是大 O 表示法考虑的是最坏的情况,也就是一个算法理论上要执行多久才能覆盖所有的情况。

  • 常见的时间复杂度有:
    常数阶O(1),对数阶O(log2n),线性阶O(n),线性对数阶O(nlog2n),平方阶O(n2),立方阶O(n3),…, k次方阶O(nk),指数阶O(2n)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。

  • 说明:

    • 大部分情况下你用直觉就可以知道一个算法的大 O 表示法
    • 大 O 表示法只是一种估算,当数据量大的时候才有用
    • 这种东西仅仅在比较两种算法哪种更好的时候才有点用。但归根结底,你还是要实际测试之后才能得出结论。而且如果数据量相对较小,哪怕算法比较慢,在实际使用也不会造成太大的问题。

要知道一个算法的大 O 表示法通常要通过数学分析。在这里我们不会涉及具体的数学,不过知道不同的值意味着什么会很有用。所以这里有一张方便的表。n 在这里代表的意思是数据的个数。举个例子,当对一个有 100 个元素的数组进行排序时,n = 100

Big-O 名字 描述
O(1) 常数级 最好的。不论输入数据量有多大,这个算法的运行时间总是一样的。例子: 基于索引取出数组中对应的元素。
O(log n) 对数级 相当好。这种算法每次循环时会把需要处理的数据量减半。如果你有 100 个元素,则只需要七步就可以找到答案。1000 个元素只要十步。100,0000 元素只要二十步。即便数据量很大这种算法也非常快。例子:二分查找。
O(n) 线性级 还不错。如果你有 100 个元素,这种算法就要做 100 次工作。数据量翻倍那么运行时间也翻倍。例子:线性查找。
O(n log n) 线性对数级 还可以。比线性级差了一些,不过也没那么差劲。例子:最快的通用排序算法。
O(n^2) 二次方级 有点慢。如果你有 100 个元素,这种算法需要做 100^2 = 10000 次工作。数据量 x 2 会导致运行时间 x 4 (因为 2 的 2 次方等于 4)。例子:循环套循环的算法,比如插入排序。
O(n^3) 三次方级 特别慢。如果你有 100 个元素,那么这种算法就要做 100^3 = 100,0000 次工作。数据量 x 2 会导致运行时间 x 8。例子:矩阵乘法。
O(2^n) 指数级 超级慢。这种算法你要想方设法避免,但有时候你就是没得选。加一点点数据就会把运行时间成倍的加长。例子:旅行商问题。
O(n!) 阶乘级 比蜗牛还慢!不管干什么都要跑个 N 年才能得到结果。

大部分情况下你用直觉就可以知道一个算法的大 O 表示法。比如说,如果你的代码用一个循环遍历你输入的每个元素,那么这个算法就是 O(n)。如果是循环套循环,那就是 O(n^2)。如果 3 个循环套在一起就是 O(n^3),以此类推。

注意,大 O 表示法只是一种估算,当数据量大的时候才有用。举个例子,[插入排序](Insertion Sort/)的最糟情况运行时间是 O(n^2)。 理论上来说它的运行时间比[归并排序](Merge Sort/)要慢一些。归并排序是 O(n log n)。但对于小数据量,插入排序实际上更快一些,特别是那些已经有一部分数据是排序好的数组。

iPhone x searchBar编辑状态黑线处理


我在适配iPhone x的时候,我修改了searchBar的背景颜色后,在编辑状态总是出现一条黑线
image.png

未处理背景色的时候代码:

1
//设置搜索框
2
 UISearchBar *searchBar = _searchController.searchBar;
3
 // 设置搜索框外部的颜色
4
 searchBar.backgroundImage = [UIImage imageWithColor:AB_White_Color size:searchBar.frame.size];
5
 // 处理搜索框编辑状态时的背景色
6
 CGSize size = CGSizeMake(searchBar.frame.size.width, searchBar.frame.size.height + 20);
7
  [searchBar setBackgroundImage:[UIImage imageWithColor:AB_White_Color size:size] forBarPosition:UIBarPositionTopAttached barMetrics:UIBarMetricsDefault];
8
9
 searchBar.showsCancelButton = NO;
10
 [searchBar sizeToFit];
11
 searchBar.placeholder = NSLocalizedString(@"public.search", nil);
12
 searchBar.delegate = self;
13
 searchBar.barTintColor = [UIColor whiteColor]; //调整iPhone x上背景颜色的改变

经测试后,将UIBarMetricsDefault修改为UIBarMetricsDefaultPrompt即可

其他机型上还是使用UIBarMetricsDefault

解决黑线问题

1
UIBarMetrics barMetrics = UIBarMetricsDefault;
2
if (IPHONE_X) {
3
    barMetrics = UIBarMetricsDefaultPrompt;
4
}
5
[searchBar setBackgroundImage:[UIImage imageWithColor:AB_White_Color size:size] forBarPosition:UIBarPositionTopAttached barMetrics:barMetrics];

效果图:
image.png

致2018的自己


我希望自己在2018这一年,认真做事,勇敢朝前,不要想太多顾虑,将想做的事情一件一件做好。

没有人愿意听你谈梦想,只有人愿意听你讲故事,努力让成为故事中的主角,为故事书写着一篇篇精彩的章节。

这个年纪的我们,总是那么浮躁,泡沫上的精彩总是吸引着我们的注意力,忘记了自己。so,多该反思自己。

希望新的时间旅程里,书写的更加精彩。

------------------致自己

xcode 9中添加python环境运行项目


1.打开xcode 9 在Cross-platform下的Other创建一个项目,如下图
image.png

2.填写项目信息,Build Tool填写python的安装路径,如果不知道的话,在终端使用which pyhon 查看路径,如下图:
image.png

image.png

3.编辑调试环境,点击Edit Scheme,如下图
image.png

4.选择run,点击Info下的Executable,选择Other
image.png

5.弹出下图的窗口,如果没显示隐藏文件使用shift+command+. 进行查看,找到下图中的python文件,选择确定

image.png

6.去掉下图中的勾选
image.png

7.选择Options 勾选上项目文件路径,并配置自己的项目的真实路径,如下图:

image.png

8.创建一个空文件,以.py结尾,main.py
image.png

9.在调试界面添加上main.py文件

image.png

10.这样就可以调试了
image.png

python中时间日期格式化


Python中时间日期格式化符号:

1
%y 两位数的年份表示(00-99
2
%Y 四位数的年份表示(000-9999
3
%m 月份(01-12
4
%d 月内中的一天(0-31
5
%H 24小时制小时数(0-23
6
%I 12小时制小时数(01-12
7
%M 分钟数(00=59
8
%S 秒(00-59
9
%a 本地简化星期名称
10
%A 本地完整星期名称
11
%b 本地简化的月份名称
12
%B 本地完整的月份名称
13
%c 本地相应的日期表示和时间表示
14
%j 年内的一天(001-366
15
%p 本地A.M.或P.M.的等价符
16
%U 一年中的星期数(00-53)星期天为星期的开始
17
%w 星期(0-6),星期天为星期的开始
18
%W 一年中的星期数(00-53)星期一为星期的开始
19
%x 本地相应的日期表示
20
%X 本地相应的时间表示
21
%Z 当前时区的名称
22
%% %号本身

textView中字符串处理


1.获取textView中每行的字符串
相关代码如下:

1
- (NSArray *)getLinesArrayOfStringInLabel:(UITextView *)textView {
2
    NSString *text = [textView text];
3
    UIFont *font = [textView font];
4
    CGRect rect = [textView bounds];
5
6
    CTFontRef myFont = CTFontCreateWithName((__bridge CFStringRef)([font fontName]), [font pointSize], NULL);
7
    NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc] initWithString:text];
8
    [attStr addAttribute:(NSString *)kCTFontAttributeName value:(__bridge id)myFont range:NSMakeRange(0, attStr.length)];
9
    CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)attStr);
10
    CGMutablePathRef path = CGPathCreateMutable();
11
    CGPathAddRect(path, NULL, CGRectMake(0,0,rect.size.width,100000));
12
    CTFrameRef frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, 0), path, NULL);
13
    NSArray *lines = (__bridge NSArray *)CTFrameGetLines(frame);
14
    NSMutableArray *linesArray = [[NSMutableArray alloc]init];
15
    for (id line in lines) {
16
        CTLineRef lineRef = (__bridge CTLineRef )line;
17
        CFRange lineRange = CTLineGetStringRange(lineRef);
18
        NSRange range = NSMakeRange(lineRange.location, lineRange.length);
19
        NSString *lineString = [text substringWithRange:range];
20
        [linesArray addObject:lineString];
21
    }
22
    return (NSArray *)linesArray;
23
}

2.按照2个英文字符作为一个字,一个中文汉字作为一个字的方式,计算字符串的实际长度
实现NSString的分类,在分类中添加方法代码:

1
//得到中英文字符串长度
2
- (NSInteger)convertToNumbers {
3
        NSInteger strlength = 0;
4
        char  *p = (char*)[self cStringUsingEncoding:NSUnicodeStringEncoding];
5
        for (NSInteger i = 0; i < [self lengthOfBytesUsingEncoding:NSUnicodeStringEncoding]; i++) {
6
            if (*p) {
7
                p++;
8
                strlength++;
9
            }
10
            else {
11
                p++;
12
            }
13
        }
14
        return strlength;
15
}
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×