首页 > 代码库 > iOS面试笔记(2)
iOS面试笔记(2)
一、为什么在使用部分第三方SDK中block回调不需要使用weakSelf,例如AFN
AFN在封装的时候,重写了setCompletionBlock方法,在回调后直接将completionBlock置为nil,打破了循环引用
二、Block为什么要用copy来修饰
默认情况下,block是存档在栈中,出了作用域就会被回收,再去调用将会crash,通过copy操作可以使其在堆中保留一份,保证能被访问。
三、消息推送流程是怎样,devicetoken怎么来的
1、应用程序通过方法
- (void)registerUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings NS_AVAILABLE_IOS(8_0) __TVOS_PROHIBITED;
注册远程通知2、通过代理方法
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {从APNS获取deviceToken3、应用程序将deviceToken提交给服务端
4、服务端将推送内容、设备标识、推送证书等打包发送给APNS
5、APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发送到iPhone。
6、iPhone把发来的消息传递给相应的应用程序,并且按照设定弹出Push通知。
四、为什么在arc下我们不需要手动控制引用计数
1、编译器会自动在适当的地方插入适当的retain、release、autorelease语句
2、这些语句是在编译过程中添加,而不是运行时
五、https协议的验证过程
1、客户端发起https请求
2、服务端配置证书,取得私钥和公钥
3、服务端将证书传递给客户端
4、客户端验证证书是否有效,若有效则使用此证书加密一组随即值
5、客户端将机密后的随机值传给服务器
6、服务端通过私钥解密,得到随即值
7、服务端将返回内容通过此随即值加密后传给客户端
8、客户端接收到加密的数据,使用先前生成的随机值解密获得数据
六、线程,runloop,autoreleasepool之间的关系
1、runloop是用来管理线程的,run loop在没有任何事件处理的时候会把它的线程置于休眠状态;只有主线程的runloop是默认开启的
2、对 于每一个Runloop, 系统会隐式创建一个Autorelease pool,这样所有的release pool会构成一个象CallStack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object会被release。
iOS面试笔记(2)