美文网首页OC基础笔记
iOS一些理论总结记录

iOS一些理论总结记录

作者: jozdee | 来源:发表于2018-02-28 17:05 被阅读17次

    后续有时间可能会不断地补充一些知识点。

    一:简要说说iOS内存管理

    1:凡是使用 alloc, new或者new开头的方法,copy或者copy开头的方法,muTableCopy或者muTableCopy开头创建出来的对象都需要release

    2:谁创建,谁释放(哪个类创建,哪个类就负责释放)

    3:alloc 是在创建对象的时候调用,会让对象的引用计数变为1;

    releease 调用一次之后,对象的引用计数减1

    4:当一个对象引用计数为0时,系统自动调用dealloc方法,销毁改对象;

    自动释放池:

    autorelease 和 autoreleasepool 是结合使用的,当一个对象不确定什么时候去释放,就可以给对象发一个autorelease的消息,系统就会自动把对象加到离它最近的自动释放池中,并没有立即释放对象,而是等到自动释放池释放的时候去对池中的对象做一次release的操作

    扩展:

    每一次对retain,alloc或者new的调用,需要对应一次release或autorealse

    需要持有一个对象,那么对其发送retain

    不再使用该对象,那么需要对其发送release(或者autorealse)

    字符串的内存管理

    1,用@“”标示出来的字符串,是写在只读数据段的,它引用的计数一直为-1

    2,用alloc retain copy mutable copy 创建出来的字符串是符合内存黄金管理法则(cocoa中的内存管理机制——引用计数)

    3,用类方法创建的字符串,不用release

    copy和mutableCopy(只用来复制字符串)时

    copy:不管是给可变字符串还是不可变字符串发送copy消息时,都会变成不可变字符串,并且被copy的对象引用计数加1,copy出来的新对象的引用计数和被copy的对象引用计数相等

    mutablecopy:不管是给可变字符串还是不可变字符串发送mutablecopy消息,字符串都会变成可变字符串,被copy的对象的引用计数不会增加,copy出来的新对象引用计数为1 

    数组的内存管理

    1,不管是可变数组还是不可变数组,往数组中添加对象的时候,对象的引用次数都加1

    2,当数组release的时候,系统会对数组中每个元素都执行release一次,来平衡添加对象的时候对对象执行的retain操作

    autorelease与autoreleasepool

    autorelease 和 autoreleasepool 是结合使用的,当一个对象不确定什么时候去释放,就可以给对象发一个autorelease的消息,系统就会自动把对象加到离它最近的自动释放池中,并没有立即释放对象,而是等到自动释放池释放的时候去对池中的对象做一次release的操作

    当我们向自动释放池pool发送release消息时,它会对池中对象发送一条release消息,并且自身也被销毁,向他发送drain消息时,只会执行前者,自身不会销毁;

    二:什么时候用delegate,什么时候用Notification,二者有何区别 ?

    一对一传值时采用delegate, 一对多的时候采用Notification。

    耦合性高:delegate、block

    耦合性低:notification

    效率⾼高:delegate、block

    效率低:notification

    调试难度难:notification

    调试难度易:delegate、block

    三:Socket 连接 和 http 连接的区别,简要叙说实现原理

    http是属于应用层的网络协议,应用广泛。

    socket是属于网络层的,可以编程tcp或者UDP协议传输数据,http协议其实就是基于tcp协议的。

    四:#import 和 #include的区别, @class代表什么?

    使⽤#import可以避免重复包含头⽂文件

    @class是用来做类引用的

    @class就是告诉编译器有这么一个类,至于类的定义是啥不知道

    @class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import

    五:了解Objective-C程序的生命周期吗,简要说下原理过程。

    程序的生命周期

    a.程序的生命周期是指应用程序启动到应用程序结束整个阶段的全过程

    b.每一个IOS应用程序都包含一个UIApplication对象,IOS系统通过该UIApplication对象监控应用程序生命周期全过程

    c.每一个IOS应用程序都要为其UIApplication对象指定一个代理对象,并由该代理对象处理UIApplication对象监测到的应用程序生命周期事件。

    UIApplicationDelegate 这个协议是应用程序的生命周期协议

    六:写一个delegate委托协议。

    1 要创建一个协议文件

    2 要确定谁是委托人谁是代理人

    3 委托人必须要有一个属性,要求给这个属性赋值的对象必须是遵循协议的

    4 代理人,必须要遵循协议,并且实现协议中的@required修饰的方法

    5 分别创建出委托人和代理人的对象,并且用代理人的对象给委托人的属性赋值

    6 用委托人的对象发消息,去控制代理方

    下面以老板与司机为例  老板委托方  代理方  司机

    声明协议 拥有驾驶方法

    @protocol WorkProtocol

    -(void)driving;

    @end

    3 委托人必须要有一个属性,要求给这个属性赋值的对象必须是遵循协议的

    #import

    #import "WorkProtocol.h"

    @interface Boss : NSObject

    @property id detegate;

    -(void)command;

    @end

    4 代理人,必须要遵循协议,并且实现协议中的@required修饰的方法

    #import

    #import "WorkProtocol.h"

    @interface Driver : NSObject  //.m文件需要实现-(void)driving;方法

    @end

    5 分别创建出委托人和代理人的对象,并且用代理人的对象给委托人的属性赋值

    6 用委托人的对象发消息,去控制代理方

    Boss * boss = [[Boss alloc] init];

            Driver * dri = [[Driver alloc] init];

            boss.detegate = dri;

            [boss command];

    七:平常开发中你是如何实现多线程编程的,iOS中是实现多线程一般用到哪几种方式,说说各自的用途或优缺点。

    理解与概念:

    进程和线程

    每个在系统上运行的程序都是一个进程

    每个进程包含一到多个线程

    线程是一组指令的集合.

    线程与UI

    程序启动后,系统会创建一个叫main的主线程

    所有的UI组件必须运行在主线程中,因此主线程也叫yUI线程

    如果把所有的任务都放在主线程中,容易造成UI阻塞(如网络访问)

    多线程编程和意义

    线程是程序中一个单一的顺序控制流程,在单个程序中同时运行多个线程完成不同的工作,称多线程.

    使用多线程可以把占据时间长的程序中的任务放到后台去处理.

    1.iOS中的三种线程,从上至下抽象层次从低到高,抽象度越高,使用越简单

              NSThread

              NSOperation

              GCD(c接口的线程)(苹果公司推荐使用GCD)

    1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程)

    2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题

    ØNSOperation/NSOperationQueue 面向对象的线程技术

    ØGCD —— Grand Central Dispatch(派发) 是基于C语言的框架,可以充分利用多核,是苹果推荐使用的多线程技术

    八:kvc是什么,kvo是什么?有什么特性?

    1> KVC:NSKeyValueCoding的简称,是一种可以直接通过字符串的名字(key)来访问类属性的机制,而不是通过调用的Setter、Getter方法访问。

    2> KVO:NSKeyValueObserving的简称,当指定的对象的属性被修改了,允许对象接收到通知的机制。

        KVC

    是键值编码,特点是通过指定表示要访问的属性名字的字符串标识

    符,可以进行类的属性读取和设置

          KVO

    是键值观察,特点是利用键值观察可以注册成为一个对象的观察者,

    在该对象的某个属性变化时收到通知

    九:请写出一个对象的setter方法  和 getter方法

    @property (setter = setAgi:,getter = Agi)int age;

    声明一个属性就已经自动实现

    十:OC中创建线程的方法有哪些?如果是主线程中执行代码,方法是什么?如果想延时执行代码,方法又是什么?

    线程创建有三种方法:使用NSThread创建、使用GCD的dispatch、使用子类化的NSOperation,然后将其加入NSOperationQueue;在主线程执行代码,方法是performSelectorOnMainThread,如果想延时执行代码可以用performSelector:onThread:withObject:waitUntilDone:

    十一:当用户按home退出时,如果当前正在下载数据,请问下载会中断吗,为什么?如果不想程序后台挂起,有何办法?

    通常,用户按一下home键,当期应用就会被进入后台,应用处在后台运行状态一小段时间后,就会进入挂起状态,此时应用不会执行任何代码。

    系统后台运行苹果官方文档中说明只支持

    音频播放

    定位

    电话

    可以使用NSURLSession提供的功能(iOS7中提供的新网络接口):

    1.通过URL将数据下载到内存

    2.通过URL将数据下载到文件系统

    3.将数据上传到指定URL

    4.在后台完成上述功能

    十二:ViewController 的loadView viewDidLoad viewDidUnload分别是什么时候调用的,在自定义viewController时在这几个函数中应该做什么工作?

    (loadView/nib文件)来加载view到内存 ——>viewDidLoad函数进一步初始化这些view ——>内存不足时,调用viewDidUnload函数释放views —->当需要使用view时又回到第一步,如此循环

    或者

    当view为nil时调用loadView,view完成加载调用viewDidLoad,view释放时调用viewDidUnload.

    十三:浅拷贝和深拷贝区别是什么

    简单的来说就是,在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误

    浅层复制:复制引用对象的指针。

    深层复制:复制引用对象内容。

    retain:始终是浅复制。引用计数每次加一。返回对象是否可变与被复制的对象保持一致。

    经过Demo验证得出最终结论

    对于不可变对象而言,copy便是浅拷贝,而mutableCopy是深拷贝。

    对于可变对象而言,copy和mutableCopy都是深拷贝。但是copy出来的对象是不可变的,而mutableCopy则是可变对象。

    十四:进程和线程区别?

    进程:分配资源的最小单位  线程:独立运行的最小单位

    十五:死锁的概念,如何解决?

    资源的抢占,尽量避免锁的嵌套

    十六:TCP、UDP、HTTP,的概念 与应用场景

    网络层:TCP\UDP 传输控制协议、用户数据报协议 可参见CSDN链接传输层TCP和UDP的区别分析与应用场景

    应用层:HTTP 基于TCP实现  超文本传输协议

    各自应用场景:文件传输、QQ语音,QQ视频

    HTTP FTP TFTP 为应用层协议

    FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件

    TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。

    TCP UDP 传输层协议

    IP 网络层协议

    HTTP 中文名称:超文本传送协议

    http是属于应用层的网络协议,应用广泛。

    socket是属于网络层的,可以编程tcp或者UDP协议传输数据,http协议其实就是基于tcp协议的。

    十七:交换两个变量的值,不使用第三个变量

    a = a + b; b = a – b; a = a – b;

    a = a ^ b; b = a ^ b; a = a ^ b;

    十八:宏定义传入两个值,返回较小的值

    #define MIN(a,b) ((a)>(b)?(b):(a))

    延伸:

    #define RADIANS_TO_DEGREES(radians) ((radians) * (180.0 / M_PI))

    #define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)

    十九: 有那些数据持久存储的方式?

    归档、数据库、xml(plist、userdefaults)、

    什么时候用数据库?小说怎么存?什么时候用userDefaults?什么时候用归档?

    数据排序、检索、修改  、数据与数据有关联性,使用数据库

    二十:iOS开发中如何使用数据库缓存?

    二十一: 你理解的MVC?iOS中的MVC分别是什么?

    MVC是Model-VIew-Controller,就是模型-视图-控制器

    model-即数据模型,view-视图展示,controller进行UI展现和数据交互的逻辑控制

    答案二

    MVC是模型、试图、控制开发模式,对于iOS SDK,所有的View都是视图层的,它应该独立于模型层,由视图控制层来控制。所有的用户数据都是模型层,它应该独立于视图。所有的ViewController都是控制层,由它负责控制视图,访问模型数据。

    二十二:队列和栈的区别

    先进先出 先进后出

    二十三: copy retain 和 assign 分别用在什么数据类型?

    被__weak修饰的指针指向其他对象的时候,对象不会进行retain,离开对象时也不会进行release 

    修饰代理对象用非原子 和 弱引用

    什么时候用assign,当然是

    基础类型:NSInteger,CGPoint,CGFloat,C数据类型(int,float,double,char等)

    使用

    copy:希望获得源对象的副本而不改变源对象内容时,对NSString

    使用

    retain:希望获得源对象的所有权时,对其他NSObject和其子类

    copy:拷贝对象。assign:传值,一般用于基础类型。retain:传地址,引用计数器加一。

    二十四:frame与bounds的区别  contentOffset,contentSize区别?

    答案:frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)bounds指的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)

    frame修改UI控件的坐标与尺寸

    bounds 只修改尺寸

    contentSize:控制滚动的区域

    contentOffset:显示区域相对于frame顶点的偏移量

    contentInset:contentView的顶点相对于scrollView的位置

    Frame: 以父视图的坐标原点作为参考系

    bounds: 以自身坐标原点作为参考系

    frame:当view做了transform的时候,该值不准确!

    二十五:UIScrollView ⽤用到了什么设计模式?列举⼀一些系统中其他类 似模式的类

    代理模式 UITableView、UIAlertView、UIActionView、... ...

    二十六:一个view从顶部到底部并消失的动画

    先改变frame再改变bounds

    二十七:ARC是什么?工作机制详细讲下。

    就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了

    1:retain, release, autorelease, dealloc由编译器自动插入,不能在代码中调用

    2: dealloc虽然可以被重载,但是不能调用[super dealloc]

    3:三方库里面的你见过那些多线程,讲一下。

    AFNetWorking  Fmdb  大量采用GCD线程

    二十八:你用到的单例模式,为什么要用,不用会怎样。

    整个应用程序只能有一个实例,实现应用程序中的一些共享资源的访问和状态的保持等。

    浪费内存,另外就是无法共享资源

    iOS中的应用

    1,UIApplication

    2,UIAccelerometer

    3,NSUserDefaults:读取应用程序设置项目。

    4,NSNotificaionCenter:提供信息广播通知。

    5,NSFileManager:提供访问文件系统的通用操作,可以定位、创建、复制文件和文件夹。

    6,NSBundle:提供动态加载(或卸载)可执行代码、定位资源文件以及资源本地化、访问文件系统等。

    二十九:tablecell的复用机制

    一行一行 的cell  都是在复用的, 滑动 tableview 的时候,刚离开视图的  cell 会被放到复用池 中,等下一个 cell需要 显示时,会先看复用池中有没有 cell 如果有的时候 ,就从复用池中拿出来cell ,没有的话就重新创建cell

    三十:GCD

    系统管理线程,我们不需要编写线程代码。只需定义想要执行的任务,然后添加到适当的调度队列(dispatch queue)。GCD会负责创建线程和调度你的任务,系统直接提供线程管理

    三十一:Object-C有多继承吗?没有的话用什么代替?

    没,protocol.

    三十二:Object-C有私有方法吗?私有变量呢?

    从object-c 动态编译机制上讲是不存在私有变量和私有方法的。但是如果你不在.h中声明变量和方法在其它地方无法访问这些变量和方法,那么就成了私有的了。私有变量也可以使用@prviter进行修饰。

    三十三:为什么很多内置的类,如TableViewController的delegate的属性是assign不是retain?

    防止循环引用,造成无法释放;

    三十四:对象是什么时候被release的?

    引用计数器为0.系统自动调用 dealloc(析构函数)的时候。

    三十五:iOS有没有垃圾回收?

    没。OC2.0有Garbage collection,但是iOS平台不提供。

    三十六:属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在那种情况下用?

    assign用于简单数据类型,如NSInteger,double,bool,

    retain和copy用于对象,

    readwrite 是可读可写特性;需要生成getter方法和setter方法时

    readonly 是只读特性只会生成getter方法不会生成setter方法不希望属性在类外改变

    assign 是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;retain 表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的 retaincount会+1;

    copy 表示赋值特性,setter方法将传入对象复制一份;需要完全一份新的变量

    时。

    nonatomic 非原子操作,决定编译器生成的setter getter是否是原子操作,atomic表示多线程安全,一般使用nonatomic

    总结二:

    readwrite 是可读可写特性;需要生成getter方法和setter方法时

    readonly 是只读特性  只会生成getter方法 不会生成setter方法 ;不希望属性在类外改变

    assign 是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;

    retain 表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1;

    copy 表示拷贝特性,setter方法将传入对象复制一份;需要完全一份新的变量时。

    nonatomic 非原子操作,决定编译器生成的setter getter是否是原子操作,atomic表示多线

    程安全,一般使用nonatomic

    三十七:Object-c的类可以多重继承么?可以实现多个接口么?

    Object-c的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++

    的多重继承;

    三十八:Category是什么?重写一个类的方式用继承好还是分类好?为什么?

    Category是类别,一般情况用类别好,用Category去重写类的方法,仅对本

    Category有效,不会影响到其他类与原有类的关系。

    三十九:对于语句NSString*obj = [[NSData alloc] init]; obj在编译时和运行时分别时什么类型的对象

    编译时是NSString的类型;运行时是NSData类型的对象

    四十:常见的object-c的数据类型有那些, 和C的基本数据类型有什么区别?

    如:NSInteger和int object-c的数据类型有NSString,NSNumber,NSArray,NSMutableArray,NSData等等,这些都是class,创建后便是对象,而C语言的基本数据类型int,只是一定字节的内存空间,用于存放数值;NSInteger是基本数据类型,并不是NSNumber的子类,当然也不是NSObject的子类。NSInteger是基本数据类型Int或者Long的别名(NSInteger的定义typedef long NSInteger),它的区别在于,NSInteger会根据系统是32位还是64位来决定是本身是int还是Long。

    四十一:id 声明的对象有什么特性?

    Id 声明的对象具有运行时的特性,即可以指向任意类型的objcetive-c的对象;

    四十二:如何对iOS设备进行性能测试?

    Profile-> Instruments ->Time Profiler

    四十三:类别的作用?继承和类别在实现中有何区别?

    答案:category 可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。

    并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。

    类别主要有3个作用:

    (1)将类的实现分散到多个不同文件或多个不同框架中。

    (2)创建对私有方法的前向引用。

    (3)向对象添加非正式协议。

    继承可以增加,修改或者删除方法,并且可以增加属性。

    四十四:类别和类扩展的区别?

    答案:category和extensions的不同在于 后者可以添加属性。

    extensions可以认为是一个私有的Category。

    类别:

    不想在更改原来封装好的类,可是随着程序功能的增加,需要在那个类中增加一个方法,以更加适合我们现在的需求。

    在类别中添加的方法,会成为原始类的一部分,与其他方法调用没有区别

    通过给父类定义类别方法,其子类也会继承这些方法。

    类别的应用

    1;对现有类进行扩展。

    2;可以作为子类的替代手段。

    3;对类中的方法归类,把一个庞大的类划分为若干小块分别进行开发,更好的对类中的方法进行更新和维护。

    扩展:

    OC是单继承。

    利用类别也可以实现多继承,不过使用协议更好。

    类别的局限性

    1;无法给类别添加成员变量。只能通过子类的方式。

    2;如果在类别中覆盖现有类的方法,会引起super消息的断裂,类目中的方法具有高的优先级。一般不要覆盖现有类中的方法。

    四十五:代理的作用?

    答案:代理的目的是改变或传递控制链。允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。可以减少框架复杂度。

    另外一点,代理可以理解为java中的回调监听机制的

    四十六:oc中可修改和不可以修改类型。

    答案:可修改不可修改的集合类。这个我个人简单理解就是可动态添加修改和不可动态添加修改一样。

    比如NSArray和NSMutableArray。前者在初始化后的内存控件就是固定不可变的,后者可以添加等,可以动态申请新的内存空间。

    四十七:我们说的oc是动态运行时语言是什么意思?

    答案:多态。 主要是将数据类型的确定由编译时,推迟到了运行时。

    不同的对象,发相同的消息,产生的结果不一样

    四十八:方法和选择器有何不同?

    答案:selector是一个方法的名字,method是一个组合体,包含了名字和实现.

    四十九: 什么时候使用NSMutableArray,什么时候使用NSArray?

    答案:当数组在程序运行时,需要不断变化的,使用NSMutableArray,当数组在初始化后,便不再改变的,使用NSArray。需要指出的是,使用NSArray只表明的是该数组在运行时不发生改变,即不能往NSAarry的数组里新增和删除元素,但不表明其数组內的元素的内容不能发生改变。NSArray是线程安全的,NSMutableArray不是线程安全的,多线程使用到NSMutableArray需要注意。

    五十:How many autorelease you can create in your application? Is there any limit?在应用中可以创建多少autorelease对象,是否有限制?

    答案:无

    五十一:If we don’t create any autorelease pool in our application then is there any autorelease pool already provided to us?如果我们不创建内存池,是否有内存池提供给我们?

    答案:界面线程维护着自己的内存池,用户自己创建的数据线程,则需要创建该线程的内存池

    五十二:什么时候需要在程序中创建内存池?

    答案:用户自己创建的数据线程,则需要创建该线程的内存池

    五十三:What is convenience constructor?什么是简便构造方法?

    答案:简便构造方法一般由CocoaTouch框架提供,如NSNumber的 + numberWithBool:  + numberWithChar:  + numberWithDouble:  + numberWithFloat:  + numberWithInt:

    Foundation下大部分类均有简便构造方法,我们可以通过简便构造方法,获得系统给我们创建好的对象,并且不需要手动释放。

    参见对象的初始化,便利初始化函数,便利构造器

    五十四:How to design universal application in Xcode?如何使用Xcode设计通用应用?

    答案:使用MVC模式设计应用,其中Model层完成脱离界面,即在Model层,其是可运行在任何设备上,在controller层,根据iPhone与iPad(独有UISplitViewController)的不同特点选择不同的viewController对象。在View层,可根据现实要求,来设计,其中以xib文件设计时,其设置其为universal。

    五十五:What is coredata?什么是coredata?

    答案:coredata框架是apple提供的一套通用自动的解决方案,包括了对象生存周期、对象关系图、持久化机制。

    补充答案:上面是翻译的,按我个人理解coredata提供一种机制,让我们可以方便的把内存中对象,及对象间的关系,映射到coredata,然后由它为我们持久化数据。相比普通的文件数据库SQlite,它的功能更强大,不需要我们先将对象数据format成SQL语句,存入数据库,再用select语句读出,而现在是从内存到coredata的数据管理,我们只需管理coredata的managed对象,而且关联了iCloud。

    不建议入坑学习或研究coredata除非项目必要参见:我为什么不喜欢 Core Data

    五十六:What is NSManagedObject model?什么是NSManagedObject模型?

    答案:NSManagedObject是NSObject的子类 ,也是coredata的重要组成部分,它是一个通用的类,实现了core data 模型层所需的基本功能,用户可通过子类化NSManagedObject,建立自己的数据模型。

    五十七:What is NSManagedobjectContext?什么是NSManagedobjectContext?

    答案:NSManagedobjectContext对象负责应用和数据库之间的交互。

    五十八:What is predicate?什么是谓词?

    答案:谓词是通过NSPredicate,是通过给定的逻辑条件作为约束条件,完成对数据的筛选。

        predicate = [NSPredicate predicateWithFormat:@"customerID == %d",n];

        a = [customers filteredArrayUsingPredicate:predicate];

    五十九:What kind of persistence store we can use with coredata?coredata有哪几种持久化存储机制?

    答案:coredatat提供以下几种存储机制:XML(iOS系统不支持),自动存储,SQLite,内存存储。

    六十:简单介绍下NSURLConnection类及+ sendSynchronousRequest:returningResponse:error:与– initWithRequest:delegate:两个方法的区别?

    答案:  NSURLConnection主要用于网络访问,其中+ sendSynchronousRequest:returningResponse:error:是同步访问数据,即当前线程会阻塞,并等待request的返回的response,而– initWithRequest:delegate:使用的是异步加载,当其完成网络访问后,会通过delegate回到主线程,并其委托的对象。

    六十一:在项目什么时候选择使用GCD,什么时候选择NSOperation?

    项目中使用NSOperation的优点是NSOperation是对线程的高度抽象,在项目中使用它,会使项目的程序结构更好,子类化NSOperation的设计思路,是具有面向对象的优点(复用、封装),使得实现是多线程支持,而接口简单,建议在复杂项目中使用。

    项目中使用GCD的优点是GCD本身非常简单、易用,对于不复杂的多线程操作,会节省代码量,而Block参数的使用,会是代码更为易读,建议在简单项目中使用。

    六十二:什么是JSON,什么是XML?

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。

    XML 代表Extensible Markup Language(eXtensible Markup Language的缩写,意为可扩展的标记语言)。

    说白了,都是一种数据交换的格式。

    六十三:UIKit是干什么的?

    主要负责视图展示与用户交互;

    六十四:类扩展与类别的区别?

    六十五:GET与POST的区别?

    1. get是从服务器上获取数据,post是向服务器传送数据。

    2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。

    3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。

    4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。

    5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

    39:http的原理与是如何与服务器建立交互的,http与https的区别?

    交互过程简述:建立tcp连接,发送报文和请求数据,然后拿到数据之后断开连接。

    ——>HTTP协议运行在TCP之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。

    ——>HTTPS是运行在SSL/TLS之上的HTTP协议,SSL/TLS运行在TCP之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。

    Https协议在Http协议的基础上,添加了SSL/TLS握手以及数据加密传输,也属于应用层协议。

    更详细的概念与原理解答参见 HTTP协议请求响应过程和HTTPS工作原理

    六十六:SDWebImage的实现原理以及缓存策略?

    特点:这个类库提供一个以UIImageView类别以支持加载来自网络的远程图片。具有缓存管理、异步下载、同一个URL下载次数控制和加载优化(内存缓存,加载图片更快)等特征

    很好的一篇文章完美解答SDWebImage的缓存策略与加载原理

    六十七:iOS中有哪些方式可以实现单例模式?

    单例模式优点

    单例模式在内存中只有一个实例,减少了内存开支。特别是一个对象需要频繁的创建、销毁时,而创建与销毁的性能也无法优化,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。(生命周期是APP结束运行时)

    单例模式可以避免对资源的多重占用。

    单例模式可以在系统设置全局的访问点,优化和共享资源访问。

    单例模式缺点

    单例模式一般没有接口,扩展很困难,除了修改代码基本上没有第二种途径实现

    单例模式对测试是不利的。在并行开发环境中,如果单例模式没有完成,是不能进行测试的。

    单例模式与单一职责原则有冲突。

    单例模式在iOS中的使用

    单例模式在iOS开发中的使用还是蛮多的,许多Foundation、Cocoa和UIKit中的类都实现了单例模式,比如应用程序本身UIApplication、文件操作类NSFileManager、消息中心NSNotificitonCenter,NSUserDefaulte等系统都已经给我们实现单例,我们只需要使用就好了。在iOS中使用单例模式要使用类方法,通过类方法返回该类的唯一对象。

    我知道的在iOS开发实现单例模式主要有以下三种方式:

    第一种

    该方法是苹果的官方文档中写的一种方式,通过覆盖NSObject的部分方法实现,使该类无法alloc、retain、release。这是最麻烦的一种方法,也是最不好的一种方法

    第二种

    第二种跟第一种差不多,也是通过覆盖NSObject的方法实现的,但是它在第一种的基础上增加了多线程的处理,所以即使在多线程下,该种方法创建的对象也是唯一的。

    第三种

    这是最后一种也是我最推荐的一种。iOS在4.0以后推出了block和GCD,这两个特性给iOS开发带来的很大的便利,也使开发变得更加趣味话。那么如何通过GCD+block来实现单例模式呢,这主要归功于dispatch_once(dispatch_once_t *predicate, ^(void)block)这个GCD的函数,他有两个参数第一参数是一个指向dispatch_once_t类型结构体的指针,用来测试block是否执行完成,该指针所指向的结构体必须是全局的或者静态的,第二个参数是一个返回值与参数均为空的block,在block体中进行对象的初始化即可。dispatch_once在程序的生命周期中保证只会被调用一次,所以在多线程中也不会有问题。 该种方法使用方法:

    + (Singleton *)sharedInstance

    {

        static Singleton *instance = nil;

        static dispatch_once_t onceToken;

        dispatch_once(&onceToken, ^{

            instance = [[Singleton alloc]init];

        });

        return instance;

    }

    使用该种方法只需要这简单的几句代码就可以实现单例了。使用起来非常方便,但是这种创建单例的方法也不是完美的,它并不能阻止人们通过alloc方法来实例化一个对象,所以这并不是严格意义上的单例模式,但是一般程序都是我们自己写,我们自己记得就好了,这也没什么可担心的,从这一点上来说第二种方法又是比较好的,具体使用的时候呢,根据实际情况来吧,各取所需就好了。

    补充一下之前常用的方法,GCD之前

    static CUser * gUser = nil; 

    +(id)currentUser 

    if(gUser == nil) 

    gUser = [[self.class alloc]init]; 

    return gUser; 

    六十八:GCD线程有哪些主键?

    参见 GCD使用方式及管理过程解答

    Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法。

    dispatch queue分成以下三种:

    1)运行在主线程的Main queue,通过dispatch_get_main_queue获取。

    2)并行队列global dispatch queue,通过dispatch_get_global_queue获取,由系统创建三个不同优先级的dispatch queue。并行队列的执行顺序与其加入队列的顺序相同。

    3)串行队列serial queues一般用于按顺序同步访问,可创建任意数量的串行队列,各个串行队列之间是并发的。

    六十九:对于OC运行时的理解?

    概念:

    OC的运行时机制:将数据类型的确定由编译时,推迟到运行时。OC的这种运行时机制使对象的类型及对象的属性和方法在运行时才能确定。

    多态:不同对象以自己的方式响应相同的消息的能力叫做多态。举个例子:自然界中的人类(Person)都有一个相同的方法-sing,男人(Man)类属于人类,女人(Wonan)类也属于人类,都继承了人类后,会实现各自的-sing方法。但是自然界中男人和女人的sing的风格又不一样,男人唱的豪迈,女人唱的委婉,但都继承了person的、唱的能力,这就是多态的现象。也就是不同的对象以自己的方式响应相同消息的能力叫多态。也可以说运行时机制是多态的基础。

    上代码:

    首先创建三个类Person Man Woman 分别在他们的.h .m文件中声明和实现-sing方法

    @interface Person : NSObject

    -(void)sing;

    @end

    @implementation Person

    - (void)sing

    {

    NSLog(@"人类都会唱歌!!!");

    }

    @end

    @interface Man : Person

    -(void)sing;

    @end

    @implementation Man

    -(void)sing

    {

    NSLog(@"男人唱歌比较豪迈!!!");

    }

    @end

    @interface Woman : Person

    -(void)sing;

    @end

    @implementation Woman

    -(void)sing

    {

    NSLog(@"女人唱歌比较婉约!!!");

    }

    @end

    然后在main函数里面调用

    int main(int argc,const char * argv[]) {

    @autoreleasepool {

    Person *p = [[Personalloc]init];

    [p sing];

    Person *m = [[Manalloc]init];//m在编译时的类型是Person,在运行时的类型的Man,这就体现了OC语言的运行时机制

    [m sing];

    Person *w = [[Womanalloc]init];

    [w sing];

        }

    return 0;

    }

    七十:iOS实现热修复的几种方案总结

    热修复技术,也称作热更新技术。由于苹果审核周期有时候比较长,所以热修复技术应运而生。经过查阅多方面的资料,进行如下总结,希望对大家有所帮助。【现在苹果审核一般仅需2个工作日,所以基本上不用热修复功能,并别热修复被苹果严厉打压】

    现在比较流行的热修复技术:

    一、使用JSPatch进行热修复。

    JSPatch能做到通过JS调用和改写OC方法。最根本的原因是 Objective-C 是动态语言,OC上所有方法的调用/类的生成都通过 Objective-C Runtime 在运行时进行,我们可以通过类名和方法名反射得到相应的类和方法,也可以替换某个类的方法为新的实现,还可以新注册一个类,为类添加方法。JSPatch 的原理就是:JS传递字符串给OC,OC通过 Runtime 接口调用和替换OC方法。

          看了一下JSPatch的源码,主要就是通过OC的runtime原理,使用JS语句实现动态更改OC源码的目的,类似C++中的多态性。

    JSPathch是一个开源项目,在github上,下载地址:JSPatch下载地址。里边有相关文档,简单易懂。另外。这里有一篇JSPatch作者写的实现原理,解释的还是蛮不错的,博客地址:JSPatch实现原理

    同时在这里给大家一个比较好的网站 ,OC转JS工具,这是一个OC转JS的一个工具网站。

    具体实现参考博客:http://www.jianshu.com/p/8cec322531ae

    二、使用ReactNative实现热修复。

    ReactNative是facebook提供的一种开源框架,使用JS语法进行跨平台开发,深受开发者青睐。直接使用ReactNative实现热修复的好像不是很多,比较流行的是使用微软的CodePush。

    这个是CodePush 的官方网站地址,这个是CodePushGitHut地址。

    具体实现参考博客:http://blog.csdn.net/u011151353/article/details/50688681

    三、使用Lua+Wax打补丁的方案实现热修复。

    使用Lua+Wax打补丁的方案,App需要集成Lua解释器和Wax框架(接近1M)。不过waxPatch对Block不太完善,多线程补丁也可能有问题,Wax也已经两年没人维护了,而且Lua调试起来也不方便。

    七十一:iOS中事件及其传递机制进行学习和分析?

    在iOS中,事件分为三类

    · 触控事件(单点、多点触控以及各种手势操作)

    · 传感器事件(重力、加速度传感器等)

    · 远程控制事件(远程遥控iOS设备多媒体播放等)

    七十二:简单介绍一下FMDB第三方库

    1.什么是FMDB

    FMDB是iOS平台的SQLite数据库框架

    FMDB以OC的方式封装了SQLite的C语言API

    2.FMDB的优点

    使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码

    对比苹果自带的Core Data框架,更加轻量级和灵活

    提供了多线程安全的数据库操作方法,有效地防止数据混乱


    核心类

    FMDB有三个主要的类

    (1)FMDatabase

    一个FMDatabase对象就代表一个单独的SQLite数据库

    用来执行SQL语句

    (2)FMResultSet

    使用FMDatabase执行查询后的结果集

    (3)FMDatabaseQueue

    用于在多线程中执行多个查询或更新,它是线程安全的

    七十三:iOS常用到加密方式有哪些?

    (1)MD5

        MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2、MD3和MD4发展而来。MD5算法的使用不需要支付任何版权费用。

        MD5功能:输入任意长度的信息,经过处理,输出为128位的信息(数字指纹);不同的输入得到的不同的结果(唯一性);根据128位的输出结果不可能反推出输入的信息(不可逆)。

        MD5加密是单向的,只能加密不能解密(破解除外)

    MD5用途:

    a,(文件效验)防止文件被篡改:1)比如发送一个电子文档,发送前,我先得到MD5的输出结果a。然后在对方收到电子文档后,对方也得到一个MD5的输出结果b。如果a与b一样就代表中途未被篡改。2)比如我提供文件下载,为了防止不法分子在安装程序中添加木马,我可以在网站上公布由安装文件得到的MD5输出结果。3)SVN在检测文件是否在CheckOut后被修改过,也是用到了MD5.

    b,防止直接看到明文:现在很多网站在数据库存储用户的密码的时候都是存储用户密码的MD5值。这样就算不法分子得到数据库的用户密码的MD5值,也无法知道用户的密码。当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。

    注意:严格意义上来说

    哈希函数,比如MD5,SHA,这些都不是加密算法。

    哈希函数:MD5,SHA 是没有密钥的,相当与指纹的概念,因此也是不可逆的;

    MD5是128位的,SHA有不同的算法,有128,256等位。。。如SHA-256,SHA-384

    然后 就是 Base64,这更加不属于加密算法的范围了,它只是将byte[]数组进行了转换,为什么要转换呢?就是因为很多加密后的密文后者一些特殊的byte[]数组需要显示出来,或者需要进行传递(电子邮件),但是直接转换就会导致很多不可显示的字符,会丢失一些信息,因此就转换位Base64编码,这些都是可显示的字符。所以转换后,长度会增加。但它是可逆的。

    (2)RSA

    RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它,它既能用于加密,也能用于数字签名,RSA是可逆的,一个字符串可以经rsa加密后,经加密后的字符串传到对端如服务器上,再进行解密即可。前提是服务器知道解密的私钥,当然这个私钥最好不要再网络传输。

    RSA的说明原理介绍参见:用实例给新手讲解RSA加密算法

    在iOS中使用RSA加密解密,需要用到.der和.p12后缀格式的文件,其中.der格式的文件存放的是公钥(Public key)用于加密,.p12格式的文件存放的是私钥(Private key)用于解密. 首先需要先生成这些文件,然后再将文件导入工程使用。具体参见:iOS中使用RSA加密

    (3)再就是 DES与AES与3DES, 这才是加密算法,因此也是可逆的,加解密需要密钥

    项目常用到的加密方法参见iOS常见的几种加密方法

    七十三:死锁的概念,如何避免死锁?

    参见:五个案例让你明白GCD死锁

    参见:iOS中GCD产生死锁原因分析及解决方案

    参加:死锁的定义、产生原因、必要条件、避免死锁和解除死锁的方法

    七十四:iOS动画实现原理与方式有哪些?

    图层是动画的核心和载体(坐标系,矩阵,锚点,试点)

    动画原理参见:简析iOS动画原理及实现——Core Animation

    第一:帧动画

    第二:第二,隐式动画,所谓的隐式动画就是指非Root Layer ,也就是手动创建的CALayer对象,都存在着隐式动画,当对非Root Layer的部分属性进行修改时,默认自动产生一些动画效果

    第三,核心动画

    CAAnimation是所用动画对象的父类,负责控制动画的执行时间和速度,是一个抽象类,不能直接使用,应该使用它的具体子类,

    主要包含:

    基本动画(CABasicAnimation)

    关键帧动画(CAKeyframeAnimation)

    关键帧动画:有两种形式

    第一种是values的形式,

    第二种是path路径的形式;

    组动画(CAAnimationGroup)

    转场动画(CATransition)

    转场动画: CAAnimation的子类,用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果

    1.什么是核心动画

    Core Animation可以用在 Mac OS X 和 iOS平台. Core Animation的动画执行过程是在后台操作的.不会阻塞主线程. 要注意的是, Core Animation是直接作用在CALayer上的.并非UIView。

    总体来说核心动画的优点有:

    1、性能强大,使用硬件加速,可以同时向多个图层添加不同的动画效果

    2、接口易用,只需要少量的代码就可以实现复杂的动画效果。

    3、运行在后台线程中,在动画过程中可以响应交互事件

    4.只有在发生改变的时候才重绘内容,消除了动画的帧速率上的运行代码,提高应用性能

    七十五:如何实现断点续传?

    七十六:面向过程与面向对象思想的区别与总结?

    一;

    1;面向对象和面向过程只是解决问题的两种不同思想。

    二:区别分析

    1;面向过程关注的是解决问题需要哪些步骤;面向对象关注的是解决问题需要哪些对象。

    2;没有开发经验很难感受到他们的区别,两种思想都能达到解决问题的目的,但是解决思路不一样。

    “面向过程”和“面向对象”的区别

    面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

    三;现实中面对对象的例子

    1;想打电话/发短信  —》找手机, 不用分析电话怎么拨通

    2;想吃饭——-》找饭店, 不用分析菜是怎么做出来的

    3;电脑坏了——-》找电脑维修工,不用分析他是怎么维修好的

    四:理解

    1:“面向过程”(Procedure Oriented)是一种以过程为中心的编程思想。“面向过程”也可称之为“面向记录”编程思想,他们不支持丰富的“面向对象”特性(比如继承、多态),并且它们不允许混合持久化状态和域逻辑。

    就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。

    2:“面向对象”(Object Oriented,简称OO)是一种以事物为中心的编程思想。

    3:参见:面向对象编程要点

    如果任何错误,欢迎各位留言指出!

    相关文章

      网友评论

        本文标题:iOS一些理论总结记录

        本文链接:https://www.haomeiwen.com/subject/rspexftx.html