一、为什么在使用部分第三方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、通过代理方法
从APNS获取deviceToken- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)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。