123

###请设想和设计框架的public的API,并指出大概需要如何做、需要注意一些什么方面,来使别人容易地使用你的框架

首先是对问题有充分的了解,在框架内部去构建对象的关系,通过抽象让其更为健壮、便于更改。

其次是API的说明文档,简单要简单易懂,注释要尽量全面,

可能会用到的设计模式有工厂模式,单例模式,观察者模式,mvc模式等

###什么是单元测试(针对函数进行正确性校验) 程序模块是软件设计的最小单位。对于面向对象编程,最小单元就是方法,而oc的单元测试针对的就是程序模块】来进行正确性检验的测试工作。 所以oc的单元测试是针对单个函数进行正确性检验的工作。

###IOS单元测试框架有哪些? XCTest都是官方的测试框架, GHUnit和OCMock都是第三方的测试框架

###super透明导致子类也透明的解决办法 super的透明对alpha会传染给子视图,想super不透明,子视图透明有两种实现方法: 1.给父试图的bgcolor设置透明度,来让父视图透明 2.super加两层subview,第一层是自己想要的透明视图。第二层是展示的页面

###AFNetworking实现原理?为什么要用AFNetworking? AFNetworking 目前使用比较多得一个下载库,目前一直在维护更新,使用非常简单,不需要添加任何关联的库。 实现原理: 1.下载使用的是NSURLSession, 2.完成或错误进度回掉是block形式, 3.管理下载的是gcd的全局串行队列, 4.真正的请求部分是在gcd的block中完成的

好处: 1、带block形式, 2、还对uikit内部的类进行类别形式添加方法(异步下载图片) 3、还可以检测网络状态。

###崩溃如何处理

1.公司内部测试出现崩溃,直接把测试机拿来。连上打包测试版的电脑上xcode。打开崩溃日志,一般会自动翻译为代码形式,可以看出崩溃在哪一行

2.已经上线appstore,直接在xcode上下载崩溃日志windw-organizer 选择crash,就可以看到想要的崩溃日志,会直接翻译成代码可读的形式,点击右侧箭头就可以直接进入相应的代码行。修改即可

###常见的加解密方式有: RSA:基于公钥和私钥的非对称加密算法。适用范围广。

RC4, AES:是一种对称加密的流行方式。加密涉及矩阵运算。 MD5, BASE64加密

###链表和数组的区别在哪里?

  • 数组可以根据下标直接存取。

  • 链表动态地进行存储分配,链表必须根据next指针找到下一个元素

如果需要快速访问数据,很少或不插入和删除元素,就应该用数组; 相反, 如果需要经常插入和删除元素就需要用链表数据结构了。

###struct和class的区别?swfit里的array是什么类型,在大量复制时会不会有性能问题 struct 结构体,重点用于组织数据模型, class 类。重点用于实现一定的功能, swift中array用结构体实现,因为因为实现了深拷贝,一般不会出现性能问题。

###ios 应用间数据传递-NSGlobalDomain

  • 使用NSUserDefault的 NSGlobalDomain(NSUSerDefault的全局表)来实现

##ios中三个特殊的系统域

  • NSGlobalDomain:系统级别的全局的域,存储系统配置信息,可通过它实现应用程序间传值
  • NSArgumentDomain:这个是在本应用程序内可访问的域,存储着应用程序的信息
  • NSRegistrationDomain;这个是存放临时数据的域

###Typeof Typeof:元运算,放在运算数之前,返回一个字符串,说明运算数的类型。跟__typeOf作用相同

###release是否一定释放内存 调用对象的release方法,只是对象的引用计数减一并不保证会释放内存。因为释放对象内存需要等到引用计数为0,所以如果引用计数为2的情况下调用release也不会释放内存。

###autorelease和release区别: release后对象的引用计数会立马减一。 autorelease后对象的引用计数不会立马减一,而是在合适的时机才减一。

###如何检测内存泄漏 1.打开僵尸变量NSZombied。此时内存泄漏的对象会在树出台打印出“message sent to deallocated”的消息

2.使用product的analyze分析工具也可以检测内存泄漏

3.使用instruments的leak工具也可以检测内存泄漏,有内存泄漏的地方会出现红色的小柱子

##生产者消费者实例(多线程安全)

 NSCondition *condition = [[NSCondition alloc] init];

    NSMutableArray *products = [NSMutableArray arrayWithCapacity:0];
 //消费者
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        while (1) {
            //加锁
            [condition lock];
            if([products count]==0)
            {
                NSLog(@"wait for Product");
                //wait 让当前线程处于等待状态
                [condition wait];
            }
            //消费一个产品
            [products removeObjectAtIndex:0];
            NSLog(@"custome a product");
            //解锁
            [condition unlock];


        }
    });

    //生产者
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        while (1) {
            //加锁
            [condition lock];
                //制作一个产品
            NSLog(@"make a product");

            [products addObject:[[NSObject alloc] init]];
            //所有处于wait的线程,均有机会开始执行
            [condition signal];
            //解锁
            [condition unlock];
            sleep(1);
        }
    });

###GCD如何停止线程 GCD的线程开启后无法停止,但是可以设置条件停止线程中的任务,让线程空闲,减少cpu的消耗

###NSThread常用方法

//创建一个子线程。并自动执行
    [NSObject performSelectorInBackground]

//在主线程执行某些操作
[NSObject performSelectorOnMainThread]

//返回当前线程
[NSThread currentThread]

//创建一个新线程并自动执行
[NSThread detachNewThreadSelector]

//NSThread创建但不会自动执行的
[[NSThread alloc] initWithTarget]

//当前线程休眠几秒
    [NSThread sleepForTimeInterval:1.0f];  

//休眠到指定时间
    [NSThread sleepUntilDate:date];

##队列暂停和恢复

//YES表示暂停,NO表示恢复
    [queue1 setSuspended:YES];

###其他属性修饰词

dynamic 意思是由开发人员提供相应的代码:对于只读属性需要提供 setter,对于读写属性需要提供 setter 和 getter。

synthesize 意思是,除非开发人员已经做了,否则由编译器生成相应的代码,以满足属性声明。

atomic :提供多线程保护,就是提供多线程的原子操作。防止数据在写入或读取时被另一个线程更改。

nonatiomic:是非原子操作,禁止多线程,变量保护。提高性能。

###计算机组成部分 运算器,控制器,存储器,输入输出

运算器和控制器是合在一起叫CPU,即中央处理器。

内存:指cpu可直接读写访问数据的地方

寄存器在cpu内不算内存

###c语言程序的内存分布 111.png

1.text :代码段,只读

2.data 分为三部分

heap(堆): 用于存放程序在运行中动态分配的内存段,指调用malloc等函数分配的内存,内存有开发者管理

stack(栈):又叫堆栈,用于存放程序临时创建的局部变量,内存管理有系统自动管理
静态数据区    :存放程序已出初始化的全局变量,静态变量和常量

3.bss:包含未初始化的全局变量和static 变量

###runloop的状态循环图 circle.png

###runloop的集中状态 1.进入runloop循环 2.即将处理time事件 3.即将处理source事件 4.即将休眠 5.结束休眠 runloop状态.png

###有scrollview切换mode的原因是: 存在scrollview。在点击UIScorllview的区域时,mode是UITrackingRunLoopMode,但若定时器的model是NSDefaultRunLoopMode,则在滚动时会停止工作。

###如何让子线程不死?

给这条子线程开启一个Runloop

###Runloop的生命周期: 在第一次获取时创建,在线程结束时销毁

###为什么Runloop并不是由系统自动控制的

因为主线程会默认启动runloop,但子线程不会自动启动runloop,故runloop并不是由系统自动控制的.

###Event Loop(消息循环)

就是do while死循环。这种机制的关键点就是如何管理事件/消息。比如;如何让在没有消息的时候线程休眠来避免资源占用,和在有消息是即时处理消息。runloop就是对它的优化。本质是一样的。

###ios消息传递方式 1.通知:NSNotificationCenter

在ios中由消息中心进行消息接收和消息广播,是一种一对多的消息传递方式

2.代理

是一种通用的设计模式,用于代理者和被代理者协调解决问题。在ios中有代理对象,委托者,协议三部分组成,让被代理者在合适的时候通过协议调用代理者实现的方法。

3.block

ios中的一种回调方法,可以将回调处理代码直接写到block代码块中,好处是逻辑清晰,代码整齐。

4.target action

如xib中button和viewcontroller的交互方式,在视图控制器中添加xib文件的button的action就可以事件button的事件传递,

5.kvo

是NSObject的分类——NSKeyValueObserving,通过监听对象属性值的变化,当属性变化时回调kvo的回调方法

###协议 协议声明了一组可以供任何类实现的方法,协议本身不是类,它只是简单的定义了一个其他对象可以实现的接口集合。

@optional表示可选的协议方法;

@required表示必须实现的协议方法

协议没有实例变量或父类只有接口

实现协议就是做了其他类的代理,也就是做了其他对象的委托对象

比如:A实现协议C,B调用协议C。那么B就是被委托者,A是B的委托对象。

添加协议:定义需要其他类实现的方法叫做添加协议。实现其他类的协议方法就是做了其他类的代理,

添加代理:就是指明自己定义协议类让谁实现

###coredata的使用步骤

创建模型文件(数据库)->(new->CoreData->DataModel)

添加实体(表)->

创建实体类(数据模型类)->(选中模型文件->editer->CreateNSManageObjectSub)

生成上下文(NSManagedObjectContext)->

保存实体类对象到数据库(直接操作的是oc对象)

###coredata的2层和3层结构的实现原理是什么? http://www.cnblogs.com/liyufeng2013/p/3782316.html

coredata 2层结构图: c2.png

coredata的3层结构图: c3.png

如果主context的save操作依然比较耗时,可是在maincontext之上,再添加一个backgroundcontext来真正实现save操作,这就是三次结构

###ios 10和ios9的coredata 兼容问题

http://blog.csdn.net/u013263917/article/details/53277909

ios9的管理上下文NSManagerObjectContext需手动创建

iOS10中管理上下文(NSManagerObjectContext)无需手动创建,从新增加的类NSPersistentContainer的viewContext获取即可

###一个context通知其他context自动同步数据的方式有哪些? 主线程添加NSManagerObjectContextDidSave通知,来让所有的context 通过mergeChangesFromContextDidSaveNotification自动同步数据

###CoreData调试-xcode调试命令 1.打开Product,选择Edit Scheme.

2.选择Arguments,在下面的ArgumentsPassed On Launch中添加下面两个选项。(注意选项顺序不能错)

(1)-com.apple.CoreData.SQLDebug

(2)1

然后在运行程序过程中,如果操作了数据库,就会将SQL语句打印在输出面板。

ios8之后创建实体类的方式改变了,生成NSManageObject subClass 的方式变为:

1.选中实体,在右侧将Codegen 改为Manaual/None 2.标题栏Edite ->Create NSManageObject subClass

注意:如果不将实体的Codegen进行修改,会产生重定义的错误。

####coreData插入

 Employee *employee = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:self.context];  
 [self.context  save:nil];

####CoreData 查询 NSFetchRequest//NSPredicate过滤条件

//1.1:FectchRequest 抓取请求对象  
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Employee"];  
    //1.2:设置过滤条件  
    NSPredicate *pre = [NSPredicate predicateWithFormat:@"name = %@",@"张三"];  
    request.predicate = pre;  
    //1.3执行查询请求  
    NSArray *emps = [self.context executeFetchRequest:request error:nil];

####coredata删除 -先查询在删除,最后保存

####关系(Relationships):实体间的关系 实体之间的关系,类似于表之间的外键关系。但是两个实体比较不需要一个相同的字段。 分为三种:

one to one 一对一

one to many 一对多

many to many多对多。

从OC的角度讲,一对一关系类似某个变量实例保存了指向另一个OC类实例的指针, 而一对多关系则如同保留了一个指向诸如NSMutableArray或者NSSet这样的集合类的指针,它们可以容纳多个对象。

###实体属性介绍: http://blog.csdn.net/longshihua/article/details/51556028 c4.png

transient(瞬态):选中标示属性不存储到持久化存储文件中,也就是属性值是由其他属性值合成或者计算而来。默认为未选中

optional(默认的,可选的

index(索引)选中标示持久化文件应该为该属性生存一个索引,根据索引来查询数据,可大大提高速度,但是会降低写入速度,默认为不选中

attribute type(属性类型)即属性的格式

default Value 默认值

Reg.ex(正则)仅针对于string类型,主要是用来验证属性值是否匹配特定的模式

Allows External Storage(允许外部存储)允许大尺寸(大于1MB)的二进制数据可以保存在持久化存储文件的外部

Validation(验证)可以保证非法数据不被保存进持久化存储文件中

####关系名词解释

Relationship:关系名

DEstination:目标对象

Inverse Relationship:反转关系,就是说关系是否是双向的

Delete Rules:实体间的删除规则

no Action 选中标示关系中的原纪录仍然认为他与被删除的关系有着联系

Nullify 当destination被删除的时候。该选项将设置relationship中的destination为null。这是关系默认的删除规则,意思是如果删除了person,将设置address的person为nil

Cascade:当删除一条person记录时,也将删除与person相关的任意address记录,用于关系不是可选的情况

Deny用于one— to - many,如果我们有一个账号(Account)实体,跟一个用户(User)实体有着to-many relationship,并且删除规则设置为Deny。则一个账号记录仅仅当没有用户记录相关联的时候才能够删除,这确保了没有用户记录就没有账户记录。 1.数据库中: Z_PK是主键。系统自动创建。

####oc根类NSObject之结构体Class

struct objc_class {
  Class isa;   
  Class super_class ; 
  const char *name ; 
  long version ;// 类的版本信息,初始化默认为0,可以通过runtime函数 class_setVersion和class_getVersion进行 修改、读取       
  long info; 
  long instance_size ;  
  struct objc_ivar_list *ivars; // ivars类的实例变量列表
  struct objc_method_list **methodLists ; // methodLists类的方法列表
  struct objc_cache *cache; // cache最近使用的方法列表
  struct objc_protocol_list *protocols; // 类需要遵守的协议列表
    }

关键字段:isa指针,指向类自身,super_class:父类 ivars:实例变量数组;methodLists;cache;protpcols:类的协议列表

####NSObject中类的方法之结构体objc_method

struct objc_method {
    SEL method_name //方法名称                                      
    char *method_types //方法参数和返回类型的描述字符串                                    
    IMP method_imp  //方法的具体实现指针,指向方法的具体实现                                        
}

##weak有默认值吗?给nil发消息安全吗? weak修饰的指针默认值是nil,

在object-c中向nil对象发送消息是安全的。不会崩溃,因为在oc中nil就是0.那函数执行就会读取从函数开始位置偏移值为0的位置,还是函数调用开始的位置,自然什么也不做就直接返回了。

至于要么返回默认的0,要么返回nil对象。要么返回0.0,则根据函数返回值决定。

###runtime如何通过selector找到相应的IMP地址? selector是SEL类型。指的是方法名。

IMP:是方法的具体实现地址,二者是一一对应的关系,

通过selector可以直接找到IMP地址,方法是methodForSelector

    BOOL res1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];
    BOOL res2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]];

    BOOL res3 = [(id)[UIViewController class] isKindOfClass:[UIViewController class]];
    BOOL res4 = [(id)[UIViewController class] isMemberOfClass:[UIViewController class]];    NSLog(@"%d**%d**%d**%d",res1,res2,res3,res4); //YES/NO/NO/NO

https://www.jianshu.com/p/e8524e99f3e7

在isKindOfClass中有一个循环,先判断class是否等于meta class,不等就继续循环判断是否等于meta class的super class,不等再继续取super class,如此循环下去。

由类的基础层次知:加入a是NSObject的子类。则a的元类(metaclass)是AMetaClass。AMetaClass的super类是NSObjectMetaclass ,NSObjectMetaclass的super类是NSObjectClass。NSObjectClass的superClass是nil

isMemberOfClass的源码实现是拿到自己的isa指针和自己比较,是否相等。

UIViewController的isa指针是UIviewControllerMetaClass,与UIviewController不同,

NSObject的isa指针是NSObjectMetaclass与NSObject不同,但NSObjectMetaClass的superclass就是NSobjectMetaClass自身,所以返回YES

###为什么TCP关闭连接的第四部,客户端收到服务器的FIN报文后,依然需要进入TIME_WAIT状态,经过2MSL(最大报文段生存时间)才能返回到CLOSE状态? 因为我们必须假设网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

####HTTP会话过程 HTTP规定了客户/服务器模式的HTTP会话(事务)包括四个步骤:

a.与服务器建立连接

b.客户向服务器提出请求

c.服务器对请求作出应答

d.断开连接:客户端接收服务器所返回的应答信息并解析,然后客户机和服务器自动关闭连接。

SSL的服务端证书包含的信息有公钥,加密方案及其他信息

SSL的客户端证书包含公钥,支持的解密方案及其他信息

###socket包含进行网络通信必须的五种信息:

连接使用的传输层协议,
本地主机机IP,
本地进程端口,
远地主机IP,
远地进程端口。

###IO传输:就是输入输出流,其中 输入流I:用于读取数据 输出流O:用于写数据

###什么情况会导致客户端socket关掉 客户端发送多次心跳(这个有客户端和服务器的协议决定比如3次)都收不到服务器的响应,可以认为是网络不好,客户端主动断开连接,发送关闭消息,此时也可以重新连接。

###socket连接在项目中的应用-网络电话 我们网络电话,为了保证通话质量,直播组件采用socket连接,此时我们的做法是。

1.在plist中添加voip后台模式

2.在应用即将进入后台代理 中使用setKeepAliveTimeout来注册一个周期性的socket重连,设置周期为600s,来最大程度的减少重连接次数

3。在应用即将渐入前台时使用clearKeepAliveTimeout 关闭这个周期性的socket重连。

###可能导致socket是连接断开的原因有哪些 1.服务器端或客户端主机down了, 2.网络故障, 3.或者两者之间长时间没有数据传输, 4.网络防火墙可能会断开该连接以释放网络资源。

###IP地址: 唯一标示网络设备的,比如129.168.1.4 与域名一一对应

###端口: 用于标示进程的逻辑地址,一个端口号表示一个进程(即一个应用程序)

###URL 同一资源定位 http;//IP:80/文件路径

####如何确定一台设备(或者设备之间如何互相认识) 端口号和ip地址就可以唯一确定一台设备,故通过端口号和IP地址设备之间就可以互相认识

###访问域名的流程 如www.baidu.com(域名) ->首先通过DNS服务器转化为百度的ip地址,然后通过这个ip地址访问百度服务器,

DSN:域名解析器,将域名解析为IP地址

###传输协议: 用什么样式进行交互,即通信规则,常见协议TCP,UDP

####HTTP:是一种数据格式, 举例说明: 从广东到北京,可以火车,飞机(tcp),到北京后,进行交流,用英语,国语(HTTP)

###IM:即时通讯,支持用户实时交谈。

比如QQ,MSN,微信,等,区别在于各自通讯协议的实现,也就是说核心在于传输协议的不同。

协议用来说明信息在网络上如何传输,如果有了统一的传输协议,各个im之间可以直接通信

###XMPP: 基于xml且开放的可扩展通信和表示协议,即xmpp协议,又称jabber协议

XMPP数据是以XML数据元流式传输,是C/S架构,是客户端通过tcp/ip的方式连接到服务器

xmpp中三个角色:客户端,服务器,网管, 通信可以发生在任何两者之间

基本的网络形式是单个客户端通过tcp/ip连接到单个服务端

XMPP的开源库是:XMPPFramework

###微信协议和环信即使通信协议 注意:微信有自己即时通讯协议,即微信不是xmpp协议

环信即时通讯的协议是仿照xmpp协议,但不是xmpp协议

####虚拟专用网络(Virtual Private Network ,简称VPN) 指的是在公用网络上建立专用网络的技术

####ROM是只读内存(Read-Only Memory)的简称

####RAM(Random Access Memory):内部存储器,简称主存,可以与cpu直接交换数据

###网络电话VOIP 就是VOIP(voice over internet protocol)),俗称 ip电话,是通过互联网直接拨打对方的固定电话和手机。

在技术层面上的定义是:将采集的声音信号经过压缩与封包以后,以数据封包的形式在ip网络进行语音信息的传输。

###网络电话实现流程 当用户上网后,使用我们的网络电话产品,比如kc通过采集用户的麦克风和声卡的数字信号进行压缩与封包处理,然后通过网络传输,将数字封包传输到离目的地最近的电话网关,然后通过电话网关将数据信号转化成在公告电话网上传输的模拟信号,并拨打对方的电话,这样双方就可以通过互联网进行通话。

###网络电话回拨流程

客户端发起回拨请求,回拨平台接受到请求后,先返回一个回拨成功码,用于客户端处理流程,

同时回拨平台会以运营商的身份回拨给呼叫方,呼叫方在听到响铃后选择接听,第一条通话链接就建立好了,

然后回拨平台呼叫被叫号码,被叫方在听到响铃后选择接听,第二条通话链接建立完成,然后回拨平台把两条线路搭通,双方就可以通话。

###直拨与回拨区别 直拨:

整个过程都必须依赖网络,因为整个过程都是走的网络流量,过程就是将用户的语音信号,在直拨系统中传输给所拨打的用户

回拨:

只有在发起通话时需要网络,因为客户端发起回拨请求后,一旦回拨系统接受请求就不再消耗用户的流量。

回拨会根据被叫方的话单进行扣费,通过流程知道回拨会有2次落地,所以回拨资费基本是直拨资费的2被,因为回拨接通后,不依赖网络,所以回拨的的通话质量会优于直拨通话。

####网路电话技术相关概念 封包:

将一定时长度的数字化之后的语音信号组合为一帧,然后按照国际电联标准,将这个语音信号帧封装到一个RTP(实时传输协议)报文,在进一步封装到UDP报文和IP报文中

电话网关:

普通电话能够通过网络进行通话的电子设备,它是可以将internet和公共电话网(PSTN)连接在一起的系统,一端连接internet,一端是可以打进打出的电话系统。

落地:

在电话网络中,信号传输给公共电话网(运营商的网络),然后通过运营商的线路路由拨打到用户所拨打的手机上,运营商按照落地的次数收费,我们按照通话时间收费。

###NSURLSession在什么情况下回存在循环引用的问题,怎么解决?

在NSURLSession头文件中发现NSURLSessionDelegate是retain修饰的,所以需要自己收到释放urlsession。

解决办法是

1.在下载完成后

取消urlsession会话并释放session。并赋nil

2.在viewCon即将消失时

取消urlsession会话并释放session

- (void)viewWillDisappear:(BOOL)animated {

[superviewWillDisappear:animated];
// 任务完成,取消NSURLSession
[self.sessioninvalidateAndCancel];
// 释放会话
self.session =nil;

###56.如何自己实现GET缓存?

iOS系统SDK已经为get请求做好了缓存。我们需要的仅仅是使用NSURLCache设置下内存缓存大小、磁盘缓存大小、以及缓存路径,代码如下

NSURLCache *urlCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil];

[NSURLCache setSharedURLCache:urlCache];

###使用atomic一定是线程安全的吗 No.atimaic是对属性的修饰词,是说属性的读和写是原子性的, 也就是说getter 和setter 方法是安全,但不代表线程安全,只是增加了线程安全的几率,

举例说明:a线程写操作时,其他线程会因为原子属性而等待,a写完后。b写,此时若a要读取就必须等待b完成,但b完成后a读取的是b修改后的值,这样就已经破坏了线程安全,如果此时有一个c在a读取前release 更会导致程序崩溃,要想线程安全必须给线程添加lock。

一句话,atomic只是保证了getter 和setter方法的线程安全,并不能保证整个属性对象的线程安全。

###frame 和bounds区别和联系 frame当前视图的大小和位置,是以父视图的原点为参考点的

bounds是当前视图是自身坐标系的位置和大小,位置一般为0,0

改变frame的位置和大小可以改变当前视图的位置和大小

改变bounds的位置(origin)会改变其子视图的原点即参考点,对大小没有影响,视图位置不变。

改变bounds的大小(size),则当前的视图的中心点不变,大小以中心点未中心进行缩放。如果bounds大于frame则frame被撑大

###如何用iOS设备进行性能测试? Profile-> Instruments ->Time Profiler

###Cocoa Touch提供了几种Core Animation过渡类?

答:4种。分别为: 交叉淡化,推挤,覆盖,显示

###UIViewController生命周期 1.init/ initwithNibname。默认xib文件名就与类名相同

2.Loadview:每次访问UIViewController的跟视图为nil时会自动调用此方法,开发者可以进一步定制view。

3.viewDIdLoad

注意:UIviewController必须重写viewDIdLoad,且需调用[super viewDIdLoad]

4.viewWillAppear:(BOOL)animated;

5.viewDidAppear:(BOOL)animated;

6.viewWillDisappear:(BOOL)animated;

7.viewDidDisappear:(BOOL)animated;   8.didReceiveMemoryWarning内存吃紧时调用

9.dealloc ()

App和UIViewController的生命周期

###设计模式 设计模式时一条被反复使用,经过分类编码,用于在特定场景下解决问题,是代码设计的经验总结。

常用的有单例模式, 代理模式, 观察者模式,mvc模式

###cocoa中常用的设计模式

  • 组合:视图对象以协调的方式构成视图层次体系

  • 命令:目标动作机制

  • 中介者:视图控制器使用中介者模式在视图和模型之间建立双向通道

  • 策略:控制器可作为视图的策略对象,指的是视图仅执行自己展示数据的功能,将特有界面行为交给控制器。而控制器作为视图的策略对象,决定应用程序的界面行为

  • 观察者 通知

###单例模式 整个个应用在运行期间只有一个类的实例,用于进行资源共享控制

优点:

在内存中只有一个实例,减少了内存开支,可以在系统中设置全局访问点,优化和共享资源访问

缺点

单例模式中不存在抽象层,所以单例类扩展困难,而且因为是共享,所有会一改全改,同时如果实例化的单例对象长时间不使用,会被系统认为是垃圾而回收,导致对象状态的丢失。

###arc的三不可原则:

不可使用new开头命名属性,

不可使用NSZone。

不可直接调用dealloc方法,重写dealloc时不许调用[super dealloc].

####基本概念:设计模式.框架.架构. 平台

从复用角度看,设计模式是代码级复用,框架是模块级复用,架构是系统级复用,平台是企业应用级复用。

架构,框架,模式是从大到小的关系,是一种组合关系。

一个框架可能使用了多个模式,而一个架构有可能应用了多个框架,

设计模式 :就是告诉你针对特定的问题如何组织类,对象和接口之间的关系。

框架:指的是一些通用的结构和组件,学名:framework

架构,是指软件结构的专有名词,可理解为体系结构,总体结构,一般针对一个行业或一类应用,是技术和应用完美的组合。比如ios的系统架构

####foundation和Application kit foundation位于核心服务层,是为所有开发奠定基础的框架,主要讲的是基本对象和基本对象集合(字符串,NSData等)的处理。

application kit 是开发交互式图形应用程序的框架

Application kit 和UIKit是同一个概念。只是在不同的平台上使用

在ios平台指的是UIKit框架

在macOS平台上指的是Application Kit框架

####Cocoa和Cocoa Touch 术语 Cocoa指的是foundation 和Application Kit框架

术语Cocoa Touch指的是Foundation和UIKit框架

###UIkit的坐标与core Graphics或者OPebGL坐标区别:

UIkit的坐标原点是左上角,向右为x轴

core Graphics和OPenGL ES 的坐标系统的原点在左下角,也是向右为x轴。

####通过xib创建view使用哪个方法?在加载完xib之 需要设置界面属性,需要重写view的哪个方法? xib创建view: [[NSBundle mainBundle] loadNibNamed:@"QFView" owner:self options:nil]

设置UIview界面属性需要重写方法:
-(void)awakeFromNib而且需要先调用[super awakeFromNib】

###开发App的步骤,开发者账号,发布app到appstore 证书分两种:主要开发者证书、发布者证书。前者开发时使用,后者发布版本时使用

(1) 模拟器调试无需代码签名;真机调试需开发者证书代码签名;发布时需发布证书签名

(2) 代码签名需要:证书+私钥(p12文件),

(3) 真机调试时要求在设备上安装描述文件(provision profile),该文件包含信息:调试者证书,授权调试设备清单,应用ID。注意一个应用对应一个描述文件。

###一句话小知识 释放后置nil 是安全释放

UIWindow是一种特殊的视图,没有相应的视图控制器

本地推送的通知,杀死进程后依然可以收到

float x 与“零值”比较的if语句。

 if(x>0.000001&&x<-0.000001)

oc默认访问权限是protect。C++默认访问权限是private

NSFileManager:文件管理者,针对文件系统,比如文件的删除,重命名,移动等操作

NSFileHandle:文件操作者,针对单独的文件,比如文件内容的修改,追加等

AutoLayout是IOS6之后引进的自动布局功能,通过勾选AutoLayout设置各种Constraint约束来实现在不同设备和不同方向上的自动布局。

[NSNotification postNotification]发出消息和接受消息的事件在同一个线程。

如果发送消息的是主线程,则接受消息的处理会使主线程阻塞,

如果发送消息的是子线程。可以避过主线程的阻塞

OC的.语法是调用一个方法,调用的实质是变量的setter/getter方法

viewWillAppear添加的东西必须在viewWillDisAppear移除。目的保持各界面的独立性

oc中类的继承关系为单一继承(super关键字的意义),并且只有共有继承,想实现多继承,可以用protocol来模拟实现

子类从新定义父类的方法称为重载,但是无需任何关键字

plist是保存程序相关的属性,叫做属性列表

selector:方法选择器,是一个方法名称,本质跟c的回调函数一致,主要是用于对象之间进行松耦合的通讯。

IBOutlet关键字,它用于通知interface builder将一个实例变量当成插座变量,从而可以与文件的拥有者(视图控制器)进行关联

IBAction关键字,它的作用是告诉interface builder 将某个方法当成目标/动作关联中的动作

block:匿名代码段,实现原理是:oc对c的扩展,基于指针和函数指针来实现的

指针:一种数据类型,用于存储一个对象的地址,占四个字节

非正式协议:NSObject的类别,创建一个NSObject的类别叫创建一个非正式协议

xmpp:基于xml协议,又名可扩展消息处理现场协议,是即时通信协议,

git开源的xmpp框架和免费的服务器openfire即可以实现小型的即时通信。

###NSUserDefaults 存入对象注意事项 1.必须存入一个自己创建的对象。

如果存入的是从NSUserDefaults取出一个对象,不管你是不是对取出的对象做修改。都会导致 存入崩溃,报的错误是过度释放。

2.自定义数据类型的存储

可使用对象的归档和解归档实现。即对象归档为NSData然后存入

####import与include import不会引起交叉编译的问题。因为在Objective-C中会存在C/C++和Object-C混编的问题,如果用#include引入头文件,会导致交叉编译。

import<> 导入系统头文件,

import"" 导入自己的头文件

include是C/C++中的

#import和@class的区别 @classA来引入一个类A时, 编译器只知道有这么一个类A,

但如果要是用这个class A的属性就必须加上#import“classA.h”

因为import会包含这个类的所有信息,包括实体变量和方法,

而@class只是告诉编译器,其后面声明的名称是类的名称

如果使用#import来相互包含,那么就会出现编译错误,

如果使用@class在两个类的头文件中相互声明,则不会有编译错误出现 只需要在。m包含需要的文件即可

###iOS apns Device token iOS apns Device token 在删除app后,再次安装就会产生新的device token,

故采用将第一次获取到的devicetoken保存到keychain中,以后不会再获取来避免一个设备有2个devicetoken,

###58.如果提交一个Json格式的数据给后台服务器,后台服务器返回的是一段普通文字,用NSURLConnection/NSURLSession/AFN分别如何实现?

使用NSURLConnection发送请求的步骤很简单

使用请求路径NSURL创建一个NSURLRequest对象,

使用NSURLConnection发送request

使用NSURLSession发送请求的步骤很简单

获取sharedSession会话对象

urlSession根据urlRequest创建请求任务NSURLSessionDataTask

sharedSession dataTaskWithRequest

执行Task

当得到服务器返回的响应后,解析数据(XML|JSON|HTTP)

###引用类型 (赋值是2个指针指向同一块内存,一改全改) 就是将一个对象赋值给另一个对象时,系统不会对此对象进行拷贝,而会将指向这个对象的指针赋值给另一个对象,当修改其中一个对象的值时,另一个对象的值会随之改变。

###值类型 (赋值时会copy对象,修改不会互相影响)

就是将一个对象赋值给另一个对象时,会对此对象进行拷贝,复制出一份副本给另一个对象,在修改其中一个对象的值时,不影响另外一个对象。

###struct和class的区别 在oc中或者swift中

class是引用类型,对象的指针在栈中,对象的值存在堆中

struct是值类型,值直接位于栈中,主要用来储存数据

class是引用类型,struct是值类型

struct不能被继承

class有默认的无参构造函数,有析构函数

struct二者均无,只能声明有参的构造函数 

class可以使用abstract和sealed,有protected修饰符,struct都不可以

作为参数传递时,class变量以按址方式传递,而struct变量是以按值方式传递的

###swfit里的array是什么类型,在大量复制时会不会有性能问题

array在swift中是用struct实现的。

Apple重写过一次array,然后复制就是深度拷贝了。

要是多次拷贝且不进行修改的话,所有arrays指向的都是同一个物理地址,只是指针移动,所以性能上还是不错的。

当然要是修改的话,array就会重新拷贝一份,这个时候开销就有点大了。

###如何处理多个网络请求并发的情况?

并发:是当有多个线程在操作时,CPU把运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。.这种方式我们称之为并发(Concurrent)。

遇到这种情况建议使用第三方的网络库。比如AFNetworking。也可以通过GCD和NSOperationQueue来控制并发

###iOS移动开发最终生成的是什么文件?其结构如何?

ios移动开发最后打包完成是一个.ipa文件.主要包括二进制的plist文件,.app文件,图标等

mac开发打包是.pkg包

###UIView如何需要重新绘制整个界面,需要调用什么方法?

UIView setNeedsDisplay和setNeedsLayout方法。

首先两个方法都是异步执行的。

setNeedsDisplay会调用自动调用drawRect方法来重会

setNeedsLayout会默认调用layoutSubViews来处理子视图中的一些数据。

所以setNeedDisplay告知视图它发生了改变,需要重新绘制自身,就相当于刷新界面.

###ios网络通信的方法有 哪些? 两大类:使用socket方式进行通信 和 使用asynsocket类库进行通信

建议使用的时候用asynsocket更好些 因为是别人已经封装好的类库,比较稳定

Socket通信的方法更灵活 因为控制都是自己在做的事情

###OpenGL:(Open graphics library)开放式图形库

###Core Foundation和Foundation

CoreFoundation框架是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能。

Foundation是oc语言的基础框架。框架中包含了很多开发中常用的数据类型,如结构体,枚举,类等,是其他ios框架的基础。

core foundation框架相对底层,里面的代码几乎都是c语言的,

而foundation中是OC的。

###你怎样用一种不同的方式做一个后台任务 APNS

task completion

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    __block UIBackgroundTaskIdentifier bgTask;// 后台任务标识

    // 结束后台任务
    void (^endBackgroundTask)() = ^(){
        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    };

    bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
        endBackgroundTask();
    }];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{        
        [backupService doBackupProcessHandler:^(float done, float total){
        //执行后台任务
        } CompletionHandler:^(NSError* error, NSArray* statistics){
        // 后台任务执行完成completion
            endBackgroundTask();
        }];
    });
}

常用的XML文件的解析方式有哪些? DOM 解析

SAX解析

XMPPFramework 是ios 平台的开源项目,使用oc实现XMPP协议,提供XML的读写工具。用于基于XMPP协议的IM通信。

###ios 设计模式的6大原则

单一职责原则

接口隔离原则

开放-关闭原则(对扩展开发,对修改关闭)

依赖倒置原则(面对接口编程)

里氏置换原则(子类尽量不重载父类的方法)

迪米特法则(两个类尽量不直接通信)

###类别的作用?继承和类别在实现中有何区别? category:有名类别,分类,只可以给原类添加新方法,不会产生新类,

继承:可以添加方法和属性,会产生新的类

类扩展:可添加方法和属性,主要用于定义私有方法和属性,一般写.m文件中

类扩展@interface ICSWLoginViewController ()
类别:@interface NSData (NSDataBase64Additions)

###类别主要有2个作用: (1)将类的实现分散到多个不同文件或多个不同框架中。(比如系统NSData和NSString等对NSObject的setValue ForKey方法的实现)

(2)向对象添加非正式协议(即向类添加NSObject的分类)

###oc优缺点:

缺点:

不支持命名空间,用前缀实现

不支持多重继承,用协议实现

优点:动态运行时机制,可与c++/c混编

###oc如何和c++/c混编 c++与oc cpp文件是c++代码,混编指的是,oc的实现文件可以调用c++(.cpp)提供的接口

混编方法,将oc的实现文件.m文件后缀名改名mm

需要注意的事情是:

1.如果调用的是C++的类方法或者实例方法,则一切正常

2.如果调用的是C++的函数,则需要在头文件中改成c语言的格式声明函数,并且在实现文件的函数前加extern "C"

c++ 函数

// c++的.h(.hpp)添加c语言声明
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
    void func1();
}
#endif

// 实现文件
extern "C" void func1(void) {
    printf("hello dyn1111\n");
}

c++类方法/示例方法

//c++ .h定义类
public:
  void testFunc();
    static void staticTestFunc();
};

//.cpp实现类
void Test::testFunc() {
    printf("hello123333 \n");
}
void Test::staticTestFunc() {
    printf("Hellow world with Static");
}

oc的.mm文件调用c++的方法或者函数

  func1(); // 函数
    Test  *aTest = new Test();
    aTest->testFunc(); //类对象方法
    Test::staticTestFunc();//类方法

c与oc:oc(.m文件)可直接调用c(.c)文件,

因为.m文件其实即使.c文件。oc完全兼容c语言,oc是由c改变而来的

###Weak和懒加载的关系 懒加载必须使用strong,如果用weak的话,因不会产生引用,故每次都会被释放,需要每次加载。

###.xib,storyboard,手动书写代码区别 xib(interface buider),

可以在窗口上面直接添加各种视图,可直接看到界面的效果,操作简单。

但不方便对视图进行动态控制,不灵活。

手动编写代码,继承(主要是UIView,UIViewController),

可以对视图进行定制,灵活控制方便。但不能马上看到效果。

storyboard:主要用于设计主页面间的结构。

可以看到界面效果,能同时进行多个界面的交互,高效快速。但不方便对视图进行动态控制

xib和storyboard主要用于界面中的元素位置固定的那种死页面

需要动态变化界面还是手动编写代码比较灵活。一般是各种方式混合使用。

###简述StoryBoard和Xib的联系和区别 xib是本质一个基于xml的描述文件,storyboard是多个xib文件的集合,也采用xml格式,

一个工程中可以有多个xib文件,一个xib文件对应着一个视图控制器(也可以对应一个视图)。

而使用storyboard时,一个工程只需要一个主storyboard文件就可以了。

因此,在包含多个视图控制器的情况下,采用storyboard管理比较方便,而且storyboard还可以描述界面之间的导航关系。

而且storyboard中xib的viewController只有在第一次使用时才加载。

###id、nil,Nil代表什么? id和void *并非完全一样。nil和C语言的NULL相同,

在oc中:

nil表示一个Objctive-C对象,这个对象的指针指向空(没有东西就是空) == NULL。

Nil定义一个指向空的类(是Class,而不是对象)。

总结nil == NULL。 nil是对象空。 Nil是类空

###UIIImage初始化一张图片有几种方法?简述各自的优缺点。

imageNamed:系统会先检查缓存,如果没有,则先加载图像到缓存,然后再返回图像。缺点:一但创建就会占用内存

initWithContentsOfFile:系统不会检查系统缓存,而直接从文件系统中加载并返回。

imageWithData:网络图片的话需要在子线程中执行。

###一个参数既可以是const还可以是volatile吗? 可以,比如:只读的状态寄存器。它是volatile因为它可能被意想不到地改变。

它是const因为程序不应该试图去修改它

###+(void)load; +(void)initialize;有什么用处? 二者都是runtime自动调用的,且只会调用一次,

load 在viewcon的初始化时调用,

initalize在初始化完成后第一次调用类方法或实例方法时调用

###self.caption = nil 与 __caption = nil的区别 self.caption 会调用caption的setter方法,其中设计到了原有对象的释放,可以避免内存泄露

而caption = nil不会

###为什么要使用空模板 因为空模板提供了一个简单的、带有一个窗口的应用程序。这是一个应用程序所需的最小框架,你可以用它作为开始来编写你自己的程序。

###声明,定义 声明不会分配内存,定义才分配内存,

不分配内存则就没办法存储数据,

所以NSArray等容器对象使用前必须alloc,分配内存或者采用系统返回的autorelease对象来分配内存

###dealloc中怎么查看某一个控件是否被释放呢?

CFGetRetainCount(( __bridge CFTypeRef)(obj))

就是把oc对象转化为CF对象,然后使用CF对象的CFGetRetainCount查看引用计数,看是否为1.

###Foundation框架类简介

Foundation类层次的根是NSObject类,它(和NSCopying协议一起)定义了基本的对象属性和行为。

Foundation框架的剩余部分由:

代表基本数据类型的类,如字符串、字节数组;

用于存储其它对象的集合类如NSArray;

一些代表系统信息的类,如日期类;还有一些代表系统实体的类,比如端口、线程、和进程

###方法和选择器有何不同? 选择器selector是一个方法的名字,method方法是一个组合体,包含了名字和实现.

###什么是简单构造方法 简单构造方法就是类方法,会创建一个对象且对象会自动释放,无需关心它的生命周期,所以叫简单构造方法

###什么是延迟加载 就是懒加载,只在用到的时候去初始化加载,也叫延时加载,懒加载实际上实现属性的get方法

好处:

1.不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强

2.避免一次加载对象造成内存过高,

注意:懒加载。必须先判断对象是否空。

###懒汉模式 只有用到的时候才去初始化。,叫延时加载。目的是避免一次加载过多对象造成内存过高。

懒加载实际就是实现属性的get方法,使代码之间独立性强。注意在get方法中必须先判断对象是否未空

###NSString使用copy属性原因 是为了防止传入的参数被无意中改变。copy会重新生产一个新的对象,参数传入后和传入前是2个对象,不会相互影响。

###动态加载:根据需要加载所需要的资源, 指ios中,根据不同的机型匹配不同尺寸的图片资源,比如,在retain设备上加载@2x图片,在iphone4等老设备上加载原图。

###访问权限 方法:.h中默认是公有的.m默认是私有的

属性:.h中默认是公有的.m默认是私有的

成员变量:默认是私有的

###oc中可修改和不可以修改类型 个人理解就是NSArray和NSMutaleArray 。

前者创建赋值后就不可以添加新的值。或者可以添加。

就是说前者内存大小是固定的。后者内存大小是可变的

###什么是推送消息? 推送通知是一种技术。是服务器端主动push资源给客户端

###如果我们不创建内存池,是否有内存池提供给我们? main.m文件会创建主线程的的内存池,用户创建的子线程,则需要创建该线程的内存池

###为什么用第三方网络库? 如果什么都用苹果原生的好,XML解析用苹果自带的解析,下载图片自己写,你会发现自己管理起来很复杂,很容易出错,而且性能不好。而第三方库可以优化这些问题

###为什么对于不透明的view将opaque必须设为YES, 因为opaque是一个性能优化开关,设为YES可以提高渲染系统的性能,一般View此值默认为YES,但UIButton,UIlabel等默认为NO,需特别注意

###如何避免庞大的xib, 可以考虑使用storyboard,因为后者只在需要的时候实例化viewcontroller

###堆和栈区别 管理方式:栈由编译器自动管理,堆由程序员自己管理,容易产生memory leak

申请大小:栈大小固定大概是2M左右,堆是不连续的内存仅受限于计算机的虚拟内存

碎片问题:栈先进先出无碎片,堆开辟释放会产生碎片

分配效率:栈高堆低

###ARC使用注意事项:

1.arc内存管理法则只适用于堆上的oc对象,

非oc对象比如CoreFoundation框架的CF开头的对象需要手动释放内存。

2.oc对象的变量,属性,局部变量均使用内存管理法则.

对于静态变量(全局变量和静态变量)是存放在静态数据区,生命周期就是app的生命周期.

3.ARC的堆变量(及oc对象)会自动初始化为nil.

4.arc下的__autoreleasing.相当于mrc下的autorealse,

而且arc下引用传入参数(对应的参数类型是**)会自动转化为__autoreleasing.

####main函数的作用

@autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));}

1.创建app核心对象,UIApplication

2.指定UIApplication的delegate

3.从storeboard加载用户界面

4.自动启动Main RunLoop.并为其创建一个autoreleasepool。

####UIApplication作用 1.UIApplication的一个主要工作是处理用户事件,所有用户事件均存储在队列中,处理时会发送栈顶事件到视图层次结构中能够响应消息的那个视图。

2.维护一个在本应用中打开的window列表,这样就可以接触应用中的任何一个UIView对象。

3.有一个代理对象AppDelegate来处理应用程序的生命周期事件(比如程序启动和 关闭)、系统事件(比如来电、记事项警告)等等

####UIApplication与其代理类(AppDelegate)之间的关系 UIApplication 是管理整个程序的生命周期,但他什么具体的事情都不做,

他只是负责监听事件当需要真正做事情的时候就交给其代理类(AppDelegate)去做。

它做的是在后面维护一些App不可更改的东西,比如:事件消息的分发和传递,给委托AppDelegate发送系统事件处理请求。

UIAppDelegate和其代理类AppDelegate存在一些已定义的协议接口,用于处理系统事件

####一句话知识点 Map Kit :用于地图展示

Core Location :用于地理定位

LBS :Location Based Service (热点搜素)

GPS,即全球定位系统(Global Positioning System)

视图不是总会有一个相应的视图控制器比如window andSubview

IOS所用在界面上显示的对象都是直接或者间接继承与UIResponder

###UIWindow在程序中主要起到三个作用: 1、作为容器,包含app所要显示的所有视图

2、传递触摸消息到程序中view和其他对象

3、与UIViewController协同工作,方便完成设备方向旋转的支持

UIKit的基本概念继承关系图: ?

###Framework与static Library区别 Framework是资源打包的方式,可以将实现文件,头文件,资源文件,说明文件等集中到一起。

static Library:打包的静态库,需要用户自己手动加入头文件,和资源文件

###混编arc和非arc 修改target-build pharse文件的设置项 项目的arc为YES模式。则在非arc的文件build pharse 加-fno-objc-arc标签

项目的arc为NO模式,则在arc的文件build pharse 加-fobjc-arc标签

###面对对象与面对过程的概念

面向过程

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

面向对象

是把构成问题事务分解成各个对象,

建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

面对过程重点在解决问题的步骤

面对对象重点在各个对象的的构建和行为分析

####iOS中有三种事件类型: 触摸事件

motion事件(摇一摇事件)

Remote (远程控制事件,主要指后台播放音乐时对进度条的控制)

###安全有哪些方式 设置字符密码,设置手势密码,人脸识别,指纹识别,回答密保问题

###常用框架

CoreData.framework: 数据库coreData

corelocation.framework:地图定位
mapkit.framework:地图显示

CoreAnimation.framework:动画

AddressBook.framework:通讯录

AVfoundation.framework:流媒体
OpenAi.framework:播放音频流

CFNetwork.framework:网络通信(套接字)
Coretelephony.framework:访问电话相关的信息,比如运营商,信号强度等,
CoreText.framework:图文混排
Gamekit.framework:实现蓝牙相互通信,即是服务端,又是客户端
Social.framework:社会化分享(新浪,QQ,微信)
MessageUI.framework:发短信,发邮件
newsstandKit.framework:反台下载

###离层渲染 就是离开屏幕,在另一块内存中渲染。非常耗内存,因为直接牵扯到2个上下文环境的切换(屏幕环境和屏幕外缓存环境)

阴影,蒙版都会出现离层渲染

###沙盒的结构 Documents:iTunes会备份该目录。一般用来存储需要持久化的数据。

Library/Preference:iTunes同会备份该目录,可以用来存储一些偏好设置

Library/Caches:缓存,iTunes不会备份该目录。内存不足时会被清除,应用没有运行时,可能会被清除,。一般存储体积大、不需要备份的非重要数据。

tmp: iTunes不会备份这个目录,用来保存临时数据,应用退出时会清除该目录下的数据。

####Workspace: 简单来说,Workspace就是一个容器,在该容器中可以存放多个你创建的Xcode Project, 以及其他的项目中需要使用到的文件。

####Project: 指一个项目,该项目会负责管理生成一个或者多个软件产品的全部文件和配置,一个Project可以包含多个Target。

####Target: 一个Target是指在一个Project中构建的一个产品,它包含了构建该产品的所有文件,以及如何构建该产品的配置。

###Scheme: 一个定义好构建过程的Target成为一个Scheme。可在Scheme中定义的Target的构建过程有:Build/Run/Test/Profile/Analyze/Archive

###ios进程管理机制 1.iOS支持系统级别的多任务,比如voip模式的ip电话。此时用户可以使用其他应用,但ip电话依旧存在。但是一般一次只能运行一个这样的app。

2.iOS里面启动app,会有一个启动进程,即BSD进程,但是BSD被iOS托管了。用户按home键或者使用手势回到桌面后,实际上进程并没有被kill掉,而是保存上下文数据“休眠”了,可以被唤醒。只有双击home彻底关闭app才会kill掉进程。除非在越狱的系统上,否则创建不了第三方服务和守护进程,应用只能注册并监听iOSpush通知,再做出响应

###ARC查看对象引用计数 CFGetRetainCount(( __bridge CFTypeRef)(obj))

就是把oc对象转化为CF对象,然后使用CF对象的CFGetRetainCount查看引用计数

###didReceiveMemoryWarning的实现 默认实现:ios6.0之前会释放UIviewContrller的resource和view

ios6.0之后只会释放UIviewcontroller的resource

释放view指的是:如果当前ViewController的view没有显示在window上,会自动将viewcontroller 的view以及其所有子view全部销毁,然后调用viewcontroller的viewdidunload方法)

  -(void)didReceiveMemoryWarning{

    [super didReceiveMemoryWarning];

    if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0) {
    // 是否是正在使用的视图
    if (self.isViewLoaded && !self.view.window)
  { 
   self.view = nil;// 目的是再次进入时能够重新加载调用viewDidLoad函数。
   }
     } }

必须用self.isViewLoaded判断视图是否正在使用,没有使用就可以释放。

###dealloc调用时机 释放一个viewcontroller的成员和它自身的东西,是viewcontroller的生命结束点。在UIViewContorller的RC = 0自动调用

注意事项:ARC下不可调用[super dealloc], 而且只可以释放资源(非view的东西)

###UIViewController创建view的loadview具体实现 loadview默认实现:即[super loadView]的实现

1.查找与UIViewController相关联xib的文件,通过加载xib来创建UIviewcontroller的view

2)如果没有找到这个xib文件,就自动创建一个空白的view赋值给UIviewController的view属性

###如何通过代码来自定义UIViewController的view? 重写laodView,但是不调用[super loadView],而是自己用代码创建一个view赋值给UIviewController的view属性

###静态链接库-静态库

静态库是程序代码的集合,是共享代码的一种方式

静态库是闭源的存在形式.a和.framework

###什么是沙箱模型?哪些操作是属于私有api范畴? 沙箱模式,就是沙盒模式,指应用程序可以在自己的沙盒里运作,但是不能访问任何其他应用程序的沙盒

iphone常见私有api的应用(比如直接发送短信,访问沙箱之外的磁盘文件).

NSDictionary *dict = @{@”key”:

nil};//value不能为空

###常见的object-c的数据类型有哪些,和C的基本数据类型有什么区别?如:NSInteger和int

object的数据类型有NSString,NSNumber,NSArray,NSMutableArray,NSData等等,这些都是class,创建后便是对象,

而C语言的基本数据类型int,用于存放数值,

NSInteger是基本的数据类型,并不是NSNumber的子类,当然也不是NSObject的子类。NSInteger是基本数据类型int或者Long的别名,它与int或者long的区别在于,NSInteger会根据系统是32位还是64位来决定是本身int还是long.

###iOS有垃圾回收机制吗?它是以怎样的机制来工作的? OC是支持垃圾回收机制的,但是apple是移动端开发不支持,Mac桌面系统开发中是支持的.

移动端开发的内存管理使用的是ARC

###简述通过Storyboard实现一个tableView

(自定义cell的关键步骤).

首先创建自己的自定义cell的类,我们叫做CustomCell,要继承于UITableViewCell。在这个类中定义自己所需要的控件。

然后,打开storyboard,选择自己要添加自定义cell的Controller。在UITableView里面添加一个cell(或者修改原有的cell)。将cell的style改为custom,将cell的类改为CustomCell,将identifier改为CustomCellIdentifier。然后,可以在cell中添加控件,将控件和刚才在CustomCell中定义的控件连起来。

最后,在ViewController的UITableView的tableView:cellForRowAtIndexPath:代理方法中添加以下代码:

CustomCell*cell=[tableView dequeueReusableCellWithIdentifier:@"CustomCellIdentifier"];

这样,就创建了一个cell,可以在这句代码之后对自己添加的控件进行设置。

###如何生成同时支持多个架构(simulator,arm7,arm64)的通用静态库?

ValidArchitectures设置为:armv7|armv7s|arm64|i386|x86_64;

然后分别选择iOS设备和模拟器进行编译,最后找到相关的.a进行合包

lipo -create真机库.a的路径模拟器库.a的的路径-output合成库的名字.a;

这样就制作了一个通用的静态库.a

###strcpy和memcpy的最大区别是什么?

复制的内容不同

strcpy只能复制字符串,

而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。

复制方法不同。

strcpy不需要指定长度,它遇到"\0"才结束复制,所以容易溢出。

memcpy则是根据其第3个参数决定复制的长度。

###static关键字的作用?

static 修改局部变量是,只初始化一次,而且再次调用会保持住上次调用的值

static 修改文件中的全局变量只能在当前文件中访问

###extern 修饰全局变量可在任何地方访问

###分散类就是类别

不仅可以扩充系统的方法,而且可以扩充自定义的类

###队列和栈有什么区别

队列先进先出 栈先进后出 插入删除不同,

栈只能在一端进行插入和删除操作的线性表

对列是一端插入一端删除的线性表

###缓存 存储器用于数据的临时存储,也叫缓存,目的是提高cpu的速度,所以在cpu开一小块内存,在进行运算时先将数据从cpu外的内存中复制到这一小块临时存储区域中,运算时就在这一小快临时存储区域内进行,因为寄存器和运算器以及控制器是非常紧密的联系在一起的,它们的频率一致,所以运算时就不会因为数据的来回传输以及各设备之间的频率差异导致系统性能的整体下降

###虚拟内存是什么? 虚拟内存是windows的内存管理技术,是让应用以为自己有足够的连续的内存,实际上它的内存是不连续的,有的在内存中,有的在外部磁盘。在运行时根据需要进行数据交换,

ios的内存管理不是如此,当内存不足时系统会清退不活动的app,因为ios有统一的推送服务,因此大多数app没有挂后台的理由,

在按home会将app完全挂起并按使用频率排优先级,考后的在app在内存不存时首先会被压缩,还是不足就会被清退,即强制关闭。

页面数据缓存实现 什么是序列化和反序列化 序列化合反序列化作用 oc中复杂对象存储到文件的方法 ios页面传值方式 ios消息传递方式 delegate 和notification的区别和使用时机 ios数据存储方式

###页面数据缓存实现

  • 静态数据缓存。1个接口对应一张sql表的一列数据,而且需要一个键.代表本次请求。

请求时先判断是否有网,有则直接请求,请求成功后把数据更新到表中,请求失败则从表中获取数据, 如果无网,则直接从表中查看是否有本地请求的结果,如果有则直接读取即可,如果没有则提示用户无网络

  • 图片缓存,采用sdwebImage的二级缓存即可

    一级内存缓存,是以图片的url为key存储到NSCache中 二级磁盘缓存,以图片url的md5值为key存储在本地沙盒的cache文件夹中.有在内存和磁盘中均找不到图片才会启动一个异步线程去下载,下载完成后会他图片写入内存和磁盘 ####什么是序列化和反序列化 *序列化是把对象转化成字节序列的过程

  • 反序列化是把字节序列恢复成对象的过程 ####序列化和反序列化作用 序列化和反序列化结合起来用于将对象写到文件里且能将序列化的二级制文件还原为对象。 ###oc中实现复杂对象(非系统内置对象)的对象存储到文件的方法
  • 循NSCoding协议 ,
  • 现对象的encoderWithCoder和initWithencoder来实现编解码,
  • 象调用NSKeyedArchiver /NSkeyedUnArchiver来与NSData互换。 ###ios页面传值方式 代 理传值; b lock传值; *通 知传值;
  • 属性传值 ;
  • 单例传值;
  • 方法传值 ###ios消息传递方式 *通 知:NSNotificationCenter
  • 代理
  • block
  • target action
  • kvo属性观察

    delegate与 Notification区别和使用时机

  • delegate:针对1对1关系,delegate有一个协议链,并且可以返回值给调用代理方法的实例。

  • otification可以针对1对1/1对多/1对0, 发布通知者仅负责发布通知。不关心接收通知的人,也无法接受通知监听者的任何返回数据,

  • 要返回某些数据时使用delegate,其他情况使用代理和notification是一个作用。 ###ios数据储存方式

  • 归档/解归档,

    NSKeyedArchiver归档 / NSKeyedUnarchiver解档) 存在本地doucument文件夹中,适用于量大且需要长久存储,缺点是读写操作比较慢

  • list(属性列表)

    用于小但不是特别重要的数据。因为拿到按照包的人可以看到这部分数据)

  • NSUserDefault偏好设置

    用于主要的少量数据)

  • sqlite数据库

  • coredata

  • 保存在服务器上或者ios的icloud云端

    用于需要时同步的数据

  • 机密存到keychain中

##ios 触摸事件处理-界面响应消息 ios界面响应事件的处理流程分为2步

  • 寻找响应消息视图
  • 消息处理。

寻找响应消息视图,就是在视图层次结构中找到能够响应消息的那个视图

消息处理就是在找到的视图里调用touch方法处理消息

###寻找响应消息的视图的过程是啥? 截屏2020-06-15下午11.25.59.png

1.当用户点击屏幕时,硬件报告触摸事件给UIKit框架,UIkit框架将事件打包成UIEvent对象并加入UIApplication管理的事件队列中

2.UIApplication从事件队列中取出事件,发送给应用程序的主窗口(UIWindow)来处理

3.应用程序的主窗口调用hittest:withEvent 方法在视图层次结构中找到一个最合适的视图来处理触摸事件

如果视图的所有的子视图的hittest:返回nil.则返回视图自己作为最合适的视图

如果视图的hittest:返回非nil,且该视图已经是叶子视图(即没有子视图).则返回该叶子视图作为最合适的视图

hittest返回非空的视图,则该视图会成为响应者链条上的一员.

###响应者链条的事件传递过程 响应者链条是由多个响应者对象链接起来的一个链条,而每一个响应者对象都是寻找处理消息的最合适视图的过程中所有hitttest返回非nil的视图,并按照寻找的过程排列。

消息处理时:从链条的最末端开始,如果view处理则结束,如果view未处理,则传递给上一个响应者,沿着链接一直上传,直到传递给Application对象,如果application对象不处理则直接丢弃

###如何判断当前视图的上一个响应者 响应者链条图.png

如果当前视图是控制器的跟视图,则控制器就是下一个响应者

如果当前视图不是控制器的跟视图,则其父视图就是下一个响应者

  • 消息处理的默认做法是将事件顺着响应者链条末端向上传递,将事件交给上一个响应者进行处理

  • 寻找响应视图是从父视图到子视图

  • 消息处理是从找到的那个子视图往父视图回溯

###如何拦截事件处理? 重写需要响应事件视图的hittest方法,返回这个视图作为做合适的视图

###如何做到一个事件多个对象处理 重写自己的touches方法,自己处理完成后在调用[super touches]传递事件处理给父视图,如果还需继续上次,父视图也按这个方法处理即可

###视图在什么情况不响应触摸事件 userinterface 为NO

hidden 为YES

alpaha 小于0.01

###超出父视图bounds的子视图可以响应触摸事件吗?

可以.设置父视图的clipsToBounds为NO,则可以显示bounds外的子视图,

然后重写父视图的pointInset方法,当点击在bounds外的子视图时依然返回YES即可

###触摸事件发生时runloop做了什么?

主线程的RunLoop被唤醒,通知Observer,处理Source1系统捕捉事件,

通过source1系统捕捉事件把事件打包成source0系统触摸事件,发送给UIKit框架 , UIKit将事件打包成UIEvent 传递给UIApplication进行应用内部的shi分发。

RunLoop处理完毕进入睡眠,此前会释放旧的autorelease pool并新建一个autorelease pool

缓存架构设计LRU方案

哈希表的实现原理?

如何解决代码冲突

31、数据结构&算法 快速排序、归并排序 二维数组查找(每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数) 二叉树的遍历:判断二叉树的层数 单链表判断环

Hook学习
JSRUN前端笔记, 是针对前端工程师开放的一个笔记分享平台,是前端工程师记录重点、分享经验的一个笔记本。JSRUN前端采用的 MarkDown 语法 (极客专用语法), 这里属于IT工程师。