1.Block相关问题:
1.Block为什么要用copy
block创建时默认分配内存在栈上,不是在堆,作用域实在创建时的作用域,在作用域外就会崩溃,所以要拷贝在堆上,在堆上才能使用本地变量
2.Block为什么不用retain
retain只是增加一次计数2,并没有把内存拷贝到堆上,还是会被回收
3.为什么进入block中的对象引用计数需要自动加1
block并不知道对象什么时候被释放,所以为了避免在使用block之前对象就被释放,所以block就retain一次
4.Block中self的循环引用
因为block需要使用copy到堆区,对象self就会被retain一次,会造成循环引用
解决办法:
在MRC下使用__block,在ARC下,使用__unsafe_unretained\weak修饰
2.@class,#import<> 跟 #import””有什么区别?
.#import会链入该头文件的全部信息,包括实体变量和方法等;二@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类如何定义的,暂时不用考虑
.#import<>用来包含系统自带的文件,#import""用来包含自定义的文件
3.frame 和 bounds 有什么不同?
frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父view的坐标系统)
bounds指的是:该view在本身坐标系统中的位置和大小。(参照点是本身坐标系统)
4.@property = ivar + getter + setter;
“属性” (property)有两大概念:ivar(实例变量)、getter+setter(存取方法)
5.iOS如何内存管理
Objective-C的内存管理主要有三种方式ARC(自动内存计数)、MRC手动内存计数、内存池
1.自动内存计数ARC:由Xcode自动在App编译阶段,在代码中添加内存管理代码。
2.手动内存计数MRC:遵循内存谁申请、谁释放;谁添加,谁释放的原则。
3.内存释放池Release Pool:把需要释放的内存统一放在一个池子中,当池子被抽干后(drain),池子中所有的内存空间也被自动释放掉。内存池的释放操作分为自动和手动。自动释放受runloop机制影响。
6.OC创建线程方法
一共三种:GCD ,NSThread,NSOperationQueue
7.iOS反射机制
假设有一天公司产品要实现一个需求:根据后台推送过来的数据,进行动态页面跳转,跳转到页面后根据返回到数据执行对应的操作。可以采用反射机制来用
反射有三种,类(NSStringFromSelector和NSSelectorFromString),方法(NSStringFromClass和NSClassFromString),协议反射(NSStringFromProtocol和NSProtocolFromString)
例如:1.class反射 通过类名的字符串形式实例化对象。 Class class=NSClassFromString(@"student");Student*stu=[[class alloc]init];将类名变为字符串。 Class class=[Student class];NSString*className=NSStringFromClass(class);2.SEL的反射 通过方法的字符串形式实例化方法。 SEL selector=NSSelectorFromString(@"setName");[stu performSelector:selector withObject:@"Mike"];将方法变成字符串。NSStringFromSelector(@selector*(setName:));
8.@public,@protected,@private,@package 声明各有什么含义?
@public任何地方都能访问;@protected该类和子类中访问,是默认的;@private只能在本类中访问;@package 本包内使用,跨包不可以。
9.UIScrollView大概是如何实现的,它是如何捕捉、响应手势的?
拦截了touch 事件,如果在150ms中未移动,把touch事件传递给内部view,如果产生移动,则滚动,如果在150ms中未移动但是移动足够远的话,且canCancelContentTouches = YES,UIScrollView会调用touchesCancelled方法,cancel掉内部view的事件响应,并开始scrolling
10.常用的设计模式
代理,观察者,单例,策略,工厂模式
11.推送的过程
1.应用服务提供商从服务器端把要发送的消息和设备令牌(device token)发送给苹果的消息推送服务器APNs。
2.APNs根据设备令牌在已注册的设备(iPhone、iPad、iTouch、mac等)查找对应的设备,将消息发送给相应的设备。
3.客户端设备接将接收到的消息传递给相应的应用程序,应用程序根据用户设置弹出通知消息。
12.假如Controller太臃肿,如何优化?
1.将网络请求抽象到单独的类中,方便处理公共逻辑,处理缓存,做对象持久化
2.界面封装抽象到专门类中,构造UIView的子类,负责控件拼装
3.构造viewModel,把vc传递给view数据的过程,构造成viewmodel
4.专门构造存储类,专门处理本地数据存取
5.整合常量
十三.网络层如何做安全处理
1.尽量使用https
2.不要传输明文密码
3.post并不比get安全
4.不要使用301跳转,容易被劫持,一定要使用请确保在http环境下并且做证书绑定校验
5.http请求带上MAC
6.http请求使用临时密钥
7.AES使用CBC模式
十五:TCP/IP的三次握手和四次挥手
三次握手:client向server发送SYN报文,服务器接收后发送SYN+ACK报文,客户端接收到报文后向服务器发送ACK报文,此时客户端进入SYN_SENT状态,服务器接收到ACK报文后服务器进入SYN_RECV状态
四次挥手:客户端向服务器发送FIN报文,服务器接收后向付出ACK报文,客户端接收ACK报文后,服务器关闭连接后悔发送FIN报文给客户端,客户端接收FIN报文后,向客户端发送ACK报文,关闭连接
网友评论