-
苹果内购
最近面试过程中,被面试官多次问到苹果内购相关的实现及遇到的问题,这里梳理以下,做个总结吧。内购关键流程1、客户端发起支付2、客户端监听购买流程3、苹果回调订单购买成功时,客户端把苹果给的receipt_data和一些订单信息上报给服务器4、服务器拿到receipt_data向苹果服务器校验5、苹果服务器返回status为0则表示发回成功其他返回值也记录总结一下21000 :App Store无法读取你提供的JSON数据21002 :收据数据不符合格式21003 :收据无法被验证21004 ...…
-
设计模式 生成器模式
定义也叫创建者模式,它将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示举例生成器模式将复杂的创建逻辑进行分割,例如生产汽车,分步骤创建安装不同的零件。如果创建逻辑简单则没有拆分的必要。优点1、客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象;2、每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者, 用户使用不同的具体建造者即可得到不同的产品对象;3、增加新...…
-
设计模式 单例模式
定义单例模式确保某一个类只有一个实例,并提供一个访问它的全局访问点。举例单例模式下,对应类只能生成一个实例。就像一个王国只能有一个国王,一旦王国里的事物多起来,这唯一的国王也容易职责过重。优点1、提供了对唯一实例的受控访问。因为单例类封装了它的唯一实例,所以它可以严格控制客户怎样以及何时访问它;2、因为该类在系统内存中只存在一个对象,所以可以节约系统资源。缺点1、由于单例模式中没有抽象层,因此单例类很难进行扩展;2、对于有垃圾回收系统的语言Java,C#来说,如果对象长时间不被利用,则可能...…
-
设计模式 抽象工厂模式
定义提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类,抽象工厂和工厂方法不同的地方在于,生产产品的工厂是抽象的。抽象工厂模式和工厂方法模式很相似,但是抽象工厂模式将抽象发挥的更加极致,是三种工厂模式中最抽象的一种设计模式。抽象工厂模式,也叫做Kit模式,提供了创建一系列相关抽象子类的接口,而无需指定它们具体的类型。抽象工厂模式中定义了抽象工厂类,抽象工厂类中定义了每个系列的抽象子类创建所需的方法,这些方法对应着不同类型的抽象子类实例化过程。每个工厂子类都对应着一个系列,工...…
-
设计模式 工厂方法模式
定义又称为工厂模式,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,即通过不同的工厂子类来创建不同的产品对象;工厂方法模式和简单工厂模式十分类似,大致结构是基本类似的。不同在于工厂方法模式对工厂类进行了进一步的抽象,将之前的一个工厂类抽象成了抽象工厂和工厂子类,抽象工厂定义一个创建抽象子类的接口,抽象工厂的子类实现这些接口并决定实例化哪个抽象子类。工厂子类决定着创建哪个抽象子类,外界决定着创建哪种工厂子类,抽象子类和工厂子类是一一对应的。在工厂方法模式中,和简单...…
-
设计模式 简单工厂模式
定义专门定义类(工厂类)来负责创建其他类的实例。可以根据创建方法的参数来返回不同类的实例,被创建的实例通常都具有共同的父类。简单工厂模式中定义一个抽象类,抽象类中声明公共的特征及属性,抽象子类继承自抽象类,去实现具体的操作。工厂类根据外界需求,在工厂类中创建对应的抽象子类实例并传给外界,而对象的创建是由外界决定的。外界只需要知道抽象子类对应的参数即可,而不需要知道抽象子类的创建过程,在外界使用时甚至不用引入抽象子类。简单工厂模式将抽象子类的创建,和关于抽象子类相关的业务逻辑分离,降低对象间...…
-
深入理解runloop
RunLoop简介运行循环,在程序运行过程中循环做一些事情,如果没有Runloop程序执行完毕就会立即退出,如果有Runloop程序就会一直运行,并且时时刻刻在等待用户的输入操作。RunLoop可以在需要的时候自己跑起来运行,在没有操作的试试就停下来休息。充分节省CPU资源,提高程序性能。RunLoop基本作用1.保持程序持续运行 程序一启动就会开一个主线程,主线程一开起来就会跑一个主线程对应的RunLoop,RunLoop保证主线程不会被销毁,也就保证了程序的持续运行;2.处理App中的...…
-
Kvo的本质
KVO的全称是Key -Value Observing,即“键值监听”,可用于监听某个对象属性值的改变代码实现结果输出可以看到我们只监听了person1属性值改变,所以只输出person1的改变。那问题来了,我们给person1,person2都改变了age属性的值,本质都是调用了LGPerson类中setAge这个方法,那么为什么person1会走到oberveValueForKeyPath这个方法,person2不会呢?KVO底层实现分析———我们断点打印一下person1和perso...…
-
多线程gcd(一)
(一)各种队列的执行效果1.常见的多线程方案2.同步和异步的主要影响:能不能开启新的线程同步:在当前的线程中执行任务,不具备开启新线程的能力异步:在新的线程中开启任务,具备开启新线程的能力3.并发和串行的主要影响:任务的执行方式并发:多个任务并发(同时)执行串行:一个任务执行完毕之后,再执行下个任务队列的类型包括:并发队列,串行队列,主队列(也是一个串行队列)决定了任务的执行方式(并发,串行)(二)常见的死锁案例使用sync函数往当前串行队列中添加任务,会卡住当前的串行队列(产生死锁)1....…
-
Cocoapods创建私有库(二)
接着上篇文章,用Cocoapods创建私有库,完成了我们自己的私有库制作,在接下来的开发工作中,可能会根据需求去更新我们的私有库,本篇文章分享下更新私有库的经历。一.更新具体做法是将要添加的源文件放到Pod/Classes中,然后编辑.podspec文件。编程完成后,本地验证下本地验证通过之后,就可以推送到远端了。这里面有个坑,就是要push tag,由于我漏了这一步,出现了一下问题。可以尝试如下代码git tag -m “update tag” 1.0.1git push –tags然后...…