iOS面试笔记(2)

一、为什么在使用部分第三方SDK中block回调不需要使用weakSelf,例如AFN

AFN在封装的时候,重写了setCompletionBlock方法,在回调后直接将completionBlock置为nil,打破了循环引用



二、Block为什么要用copy来修饰

一般用copy来修饰,在arc环境下编译器默认会用copy修饰,一般情况下在block需要捕获外界数据时,该block就会被分配在堆区,但在MRC环境下犹豫手动管理引用计数,block一般被分配在栈区,需要copy到堆区来防止野指针错误。

三、消息推送流程是怎样,devicetoken怎么来的

1、应用程序通过方法

- (void)registerUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings NS_AVAILABLE_IOS(8_0) __TVOS_PROHIBITED;

注册远程通知

2、通过代理方法

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
从APNS获取deviceToken

3、应用程序将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。

猜你喜欢

转载自blog.csdn.net/u014745414/article/details/71301191