自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

欢迎来到Jack的程序世界

做一名合格的程序员

  • 博客(242)
  • 收藏
  • 关注

原创 博客迁移到简书,欢迎关注

后续的博客CSDN不再更新,如需关注,请关注简书,谢谢

2021-12-29 10:16:32 1248

原创 C++ - 数组

数组如果有100个互不相关联的数据,可以分别把它们存放到100个变量中,但是如果这些数据是有内在联系的,是具有相同属性的(如:100个学生的成绩),那么就可以把这些数据看作一个整体,也就是数组了。所谓数组,就是用一个统一的名字代表这批数据,而用序号或下标来区分各个数据。例如:s代表学生成绩这组数据,s就是数组名,用s1,s2,s3分别代表学生1,学生2,学生3的成绩,s右下角的数组1,2,...

2018-08-15 22:19:23 2142

原创 设计原则 - 依赖倒置原则(DIP)

依赖倒置原则依赖倒置原则(Dependence Inversion Principle, DIP)原始定义是High level modules should not depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details.D...

2018-07-17 18:04:27 606

原创 Swift - 抽象工厂模式

什么是抽象工厂模式抽象工厂模式(Abstract Factory Pattern) 是一种比较常见的设计模式,其定义如下:Provide an interface for creating families of realted or dependent objects without specifying their concrete classes.(为创建一组相关或相互依赖的对象提供一个...

2018-07-17 15:33:44 958

原创 设计原则 - 里氏替换原则

在面向对象的语言中,继承是必不可少的、非常优秀的语言机制,它有如下优点:代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性;提高代码的重用性;子类可以形似父类,但又异于父类,“龙生龙,凤生凤,老鼠生来会打洞”是说子拥有父的“种”,“世界上没有两片完全相同的叶子”是指明子与父的不同;提高代码的可扩展性,实现父类的方法就可以“为所欲为”了,君不见很多开源框架的扩展接口都是通过继承父类来完成的...

2018-07-16 13:00:01 388

原创 设计原则 - 单一职责原则

单一职责原则定义:单一职责原则的英文名称是Single Responsibility Principle,简称是SRP。SRP原则的解释是:There should never be more than one reason for a class to change。即不要存在多于一个导致类变化的原因,简单来说:就是一个类只负责一项职责。问题由来:假如一个类T负责两个不同的职责:职责P1...

2018-07-13 17:33:06 257

原创 iOS - 备忘录模式(Memento Pattern)

在响应某些事件时,应用程序需要保存自身的状态,比如当用户保存文档或者程序退出时。具体一点:当游戏退出之前,可能需要保存当前会话的状态,如游戏等级、敌人的数量、可用武器的种类等。当游戏再次打开时,玩家可以从离开的地方接着玩。很多时候,保存程序的状态真的不需要什么特别的方法,任何简单有效的方法都可以,但是保存的信息应该只对原始程序有意义。模式定义在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对...

2018-07-05 17:34:03 730

原创 iOS - 策略模式(Strategy Pattern)

策略模式定义定义一系列的算法,把它们一个个封装起来,并且使它们可相互替代。策略模式的三个角色策略模式使用的是面向对象的继承和多态机制,一起来了解一下策略模式中的三个角色:Context封装角色简单理解为上下文,起承上启下的作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。Strategy抽象策略角色策略,算法家族的抽象,通常为接口,定义每个策略或者算法必须具有的方法和属性。Concre...

2018-07-03 15:02:02 801

原创 JS - 基本语法

JavaScript是一种脚本语言,主要功能是:动态修改html页面内容,包括创建、删除html页面元素、修改html页面元素的内容、外观、位置、大小等。数据类型和变量任何语言都离不开数据类型和变量,虽然JavaScript语言是弱类型的语言,但它一样支持变量声明,变量一样存在作用范围,即有局部变量和全局变量之分。定义变量的方式因为JavaScript是弱类型的脚本语言,所以使用变量之前,可以无须...

2018-06-04 19:08:33 19002 3

原创 iOS9 - Bitcode(中间码)

Bitcode是什么?首先我们看一下官方描述:Bitcode is an intermediate representation of a compiled program. Apps you upload to iTunes Connect that contain bitcode will be compiled and linked on the App Store. Including b...

2018-05-24 19:30:54 1405

原创 iOS - 通用链接(Universal Link)

什么是通用链接通用链接是iOS9推出的一项新功能,如果你的应用(app)支持通用链接(Universal Link)之后,iOS用户能够在点击网页的链接的时候无缝的重定向到已经安装的app,不需要额外的任何操作。如果没有安装对应的app,那么点击链接会使用Safari打开网页。在iOS9以前,对于各种浏览器,Safari中唤醒app的需求,我们通常是只能使用scheme的方式。通用链接的优点唯一性...

2018-05-17 15:45:52 7147

原创 SnapKit - 修改约束

AutoLayout现在是iOS开发布局的必备,对于使用Swift语言开发的项目,我们经常使用SnapKit进行UI布局,因为使用简单,方便。基本的使用方法官方已经写的非常详情了,可以看这里。官方为我们提供了几种方式来修改约束,先了解一下:1、引用约束(References)我们能够声明一个局部变量或者类属性来引用我们想要修改的约束,也可以使用数组存储引用多个约束,然后对引用的约束进行修改var ...

2018-05-14 17:56:20 10931

原创 iOS - load和initialize的区别

有时候,类必须先执行某些初始化操作,然后才能正常使用。在Objective-C中,绝大多数都继承自NSObject这个根类,而该类有两个方法,可用来实现这种初始化操作。首先讲的是load()方法: load()class func load()官方介绍Invoked whenever a class or category is added to the Objective...

2018-05-07 09:48:35 1052

原创 Autolayout - Changing Constraint

在iOS中进行布局,现在基本上是使用Autolayout,所以不免有时候需要对约束进行修改,比如:修改约束,或者为视图添加动画. 对于改变约束其实就是修改潜在的约束公式,如下:  那么有哪些行为会改变约束呢?1) 生效和失效约束(Activating or deactivating a constraint)2)改变约束的常量值(Changing the constrain...

2018-04-26 17:08:36 675

原创 Autolayout - NSLayoutAnchor

iOS9引入了NSLayoutAnchor来固定视图的约束。NSLayoutAnchor是工厂类可以快速创建布局对象,它的出现可以让代码变得更加简洁,而且可以有静态检查能力,并提供了额外的约束正确保证。并且Apple推荐使用NSLayoutAnchor进行布局而不是使用NSLayoutConstraint。NSLayoutAnchorNSLayoutAnchor有3个子类:NSLayoutXAxi...

2018-04-25 17:48:39 1592

原创 Swift4 - KVO的浅析

KVOKVO即Key-Value-Observing,键值观察,是观察者模式的一种实现。KVO提供了一种机制能够方便的观察对象的属性。如:指定一个被观察对象,当对象的某个属性发生变化时,对象会获得通知,进而可以做出相应的处理。KVO实现原理官方文档具体描述如下:Automatic key-value observing is implemented using a technique called...

2018-04-12 14:53:10 5119

原创 AutoLayout - 内容压缩阻力(Content Compression Resistance)和内容吸附(Content Hugging)

在使用Storyboard进行UI布局的时候,我们应该可以看到视图的两个属性:“Content Compression Resistance Priority”和“Content Hugging Priority”.比如:在Storyboard中添加一个label,然后设置垂直、水平居中的约束,选择按钮,点击show the size inspector(即右侧倒数第二个图标),就可以看到下面的内...

2018-04-10 09:17:14 883

原创 Swift4 - GCD的使用

从Swift3开始GCD的API就发生了很大的变化,更加简洁,使用起来更方便。像我们经常开启一个异步线程处理事情然后切回主线程刷新UI操作,这里就变的非常简单了。 DispatchQueue.global().async { // do async task DispatchQueue.main.async { // update UI } }...

2018-03-30 17:33:27 5482

原创 Runtime之objc_msgSend函数

首先了解一下什么是Runtime?Runtime顾名思义即为运行时。就是系统运行时候的一些机制,它提供了一些使得对象之间能够传递消息的重要函数,其中最主要的就是消息机制了。相较于C语言而言,C语言使用的是“静态绑定”,函数的调用在编译期就能知道运行期所需要调用的函数了,编译完成之后就按照顺序执行(面向过程就是这么任性)。在对象上调用方法是OC 中经常使用的功能,用 OC 的术语来说,叫做传递消息....

2018-03-30 08:37:45 850

原创 插入排序

插入排序插入排序(Insertion-Sort)是一种简单直观的排序算法。排序算法(英语:Sorting algorithm)是一种能将一串数据依照特定排序方式进行排列的一种算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。举个例子插入排序,对于少量元素的排序,它是一个有...

2018-03-24 22:43:56 1329

原创 C语言-变量的存储类型

了解变量的存储类型变量的存储类型决定了变量什么时候被分配到指定的内存空间中,以及什么时候释放存储空间。因此,存储类型就是为变量分配使用内存空间的方式,也可以称为存储方式。变量的存储方式分为两种,即动态存储和静态存储。要理解动态存储和静态存储方式,首先要了解一下内存中用户存储空间的基本情况,系统提供给用户的存储空间可以分为3个部分,即程序区、静态存储区、动态存储区。其中程序区用来存放用户要执行的程序...

2018-03-24 10:33:46 446

原创 折半查找(binary search)

折半查找是将有序的数列不断的缩小一半,直到找到该元素或者折半区域的首元素位置高于尾元素的位置为止。即将数列按有序化(递增或递减)排序,查找过程中采用跳跃方式查找,先以有序数列的中点位置为比较对象,如果要查找的元素值小于改中点元素,则将带查序列缩小为左半部分,否则为右半部分,通过一次比较,将查找区间缩小一半,如此循环直到最后找到元素或者未找到元素。更详细解释看这里。开发思路折半查找是一种高效的查找方...

2018-03-18 10:22:37 401

原创 RxSwift - Schedulers

Scheduler简单来说Scheduler就是进程执行的上下文(也可以说程序执行的上下文)。上下文(context)可以是一个线程(thread),一个派发列队(dispatch queue),或者是用于OperationQueueScheduler中的NSOperation。这里有一个好例子说明调度者怎样被使用:由上图可知,我们可能在后台调度者中(Background Scheduler)进行...

2018-03-06 08:42:15 748

原创 UIView和CALayer的关系

UIView是iOS系统中界面元素的基础,所有的界面元素都是继承自它。平时的开发中我们经常使用UIView,比如初始化一个UIView并设置它的frame、背景颜色等属性,但有时候UIView满足不了我们,比如:需要设置UIView的圆角和边框等操作,那么这个时候我们就会使用view.layer,即CALayer,那么两者之间到底有什么关系呢?1、每个UIView都对应着一个CALayer,当我们...

2018-03-05 19:09:02 1837

原创 iOS - loadView和viewDidLoad

loadView方法每一个视图控制器(UIViewController)都会生成一个loadView方法,很多情况下我们都不会使用它,因为创建一个视图控制器之后并没有该方法,而且苹果也建议不要直接调用该方法,如果需要那么就要重写loadView方法。那么该方法到底什么时候被调用?有什么作用?默认的实现是怎样的?loadView什么时候被调用每次我们访问视图控制器(UIViewController)...

2018-03-02 11:40:33 1634

原创 Swift - Static和Class

static 和 class在Swift中static和class都表示“类型范围作用域”的关键字。在所有类型中(class、static、enum)中,我们可以使用static来描述类型作用域。class是专门用于修饰class类型的。static可以修饰属性和方法class Person { // 存储属性 static let age: Int = 20 // 计算...

2018-03-01 18:59:21 4980

原创 CALayer实现圆角阴影效果

直接上代码:#import "ViewController.h"#define PHOTO_SIZE 160@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; CGPoint position...

2018-02-08 10:28:41 1296

原创 AutoLayout - NSLayoutConstraint

什么是NSLayoutConstraintNSLayoutConstraint由名字翻译过去就是布局约束。该类是表示用户界面上两个对象之间的布局关系,并且该关系必须满足基本约束的布局系统。解析约束(Constraint)布局视图(view)定义为一系列的线性方程,每一个约束(constraint)都代表一个方程,格式如下:上面的约束表示RedView的左边距(left或

2018-01-31 10:40:08 368

原创 iOS - 正则表达式

正则表达式又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。模式匹配允许我们做很多有用的事情,比如:验证手机号,邮箱,确认输入,执行高级的文本控制

2018-01-30 14:22:37 436

原创 RxSwift - UITableViewCell上按钮事件处理

RxSwift与UITableView的使用,之前文章简单的实现了一下。今天主要是实现如何处理UITableViewCell上的按钮事件。以前我们通常会选择使用代理、闭包、通知这些方法中的一个方法,我个人喜欢闭包。但是现在已经开始使用RxSwift,所以一起来看看RxSwift中我们如何处理按钮事件。UITableViewCell的内部事件一般对于cell的点击,会触发其代理方法:  func t...

2018-01-29 11:11:12 5902 2

原创 iOS - 使用TestFlight进行App的Beta版本测试

TestFlight能够让我们很容易在app正式发布之前邀请用户来测试我们的app并且收集反馈信息。为了使用TestFlight,仅仅是需要上传app的beta版本iTunes Connect,然后在iTunes Connect中添加你想邀请测试人员的名字和邮箱。测试者需要安装TestFlightapp,然后通过TestFlight-app下载beta版本app进行测试并反馈信息。TestFlig...

2018-01-19 16:35:13 18518

原创 iOS - 推送证书的配置(Communicate with APNs using a TLS certificate)

注意:想要配置iOS推送证书,首先需要一个有效的Apple账号登录Apple的开发者中心 https://developer.apple.com,选择进入Account,输入自己的开发者账号进行登录然后选择Certificates, IDs & Profiles(证书,标识,配置文件)进一步选择Certificates,点击添加按钮(+)Certificat

2017-12-29 11:21:23 2533 1

原创 iOS - MVVM

作为一名iOS开发者,我们经常使用MVC模式,也就是Model-View-Controller.这是一种标准的方式来构建我们的iOS应用。但是由于MVC存在着一些问题,所以在iOS开发中,开始使用了一种新的架构MVVM,即Model-View-ViewModel. 首先回顾一下我们常用的MVC模式。Model-View-Controller由图可知,官方内容,MVC设计模式将应用中的对象分为3种角...

2017-12-25 14:24:55 2635

原创 iOS9 - UIStackView

UIStackView在iOS9中苹果在UIKit框架中引入了一个新的视图类UIStackView。UIStackView类提供了一个高效的接口用于平铺一行或一列的视图组合。UIStackView视图管理着所有在它的arrangedSubviews属性中的视图的布局。这些视图根据它们在 arrangedSubviews数组中的顺序沿着 stackView视图的轴

2017-12-25 11:28:34 1403

原创 RxSwift - ObserveOn VS SubscribeOn

ObserveOn VS SubscribeOn

2017-12-17 20:02:35 2953 1

原创 Swift - TableViewCell高度动态计算

在iOS8,我们为了允许cell自动计算高度,必须注意以下几点:1:当创建UITableViewCell的时候使用Auto Layout布局子视图,添加对应的约束( leading, top, trailing and bottom constraints)2:设置tableView的rowHeight为UITableViewAutomaticDimension

2017-12-16 21:49:30 4434

原创 Swift4 - KVC与KVO

KVC和KVO是我们开发中常用的功能,现在来看一下在Swift4中的变化KVC在Swift4的时候,Struct也支持KVC,我们不在使用setValue: forKeypath的方式,而是使用新的语法特性,索引,下面看一下例子,参考这里:struct Person { var name: String}struct Book { var title:

2017-12-05 20:42:51 2027

原创 iOS - UITextview的简单使用

UITextView继承于UIScrollView,所以它也是一个可滚动控件。UITextView是我们开发过程中显示多行文本的首选,它支持显示大量文本内容,并且支持使用自定义样式信息和编辑功能。首先我们创建一个UITextView,并设置部分属性class ViewController: UIViewController { lazy v

2017-11-27 19:52:23 2561

原创 RxSwift - UITableView的简单使用

UITableView是我们经常用的一个控件,而且在开发过程中经常需要设置dataSource和delegate,然后实现相应的协议:func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { }func tableView(_ tableView: UITa

2017-11-23 14:30:26 2579

原创 Swift4 - 动态计算UITableView中tableHeaderView的高度

开发的过程中,经常使用UITableView的tableHeaderView视图,对于固定高度的tableHeaderView,我们使用非常简单。创建一个自定义视图,计算好固定高度即可。如果要动态更新tableHeaderView的高度,仅仅是将自定义的view进行计算高度,有时候我们会发现tableHeaderView高度还是原来的高度,没有发生变化,在是显示的内容变多之后,会有部分内容看不到。

2017-11-21 20:28:35 5205 1

空空如也

空空如也

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

TA关注的人

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