OC生命周期、内存管理、Runtime、GCD、Http协议与TCP协议

UIViewController 生命周期

  • initWithNibName: bundle:
  • initWithCoder:
  • awakeFromNib:
  • loadView:
  • ViewDidLoad
  • ViewWillAppear
  • ViewWillLayoutSubviews
  • ViewDidLayoutSubviews
  • ViewDidAppear
  • ViewWillDisappear
  • ViewDidDisappear
  • dealloc

Http协议与TCP协议简单理解

TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性。Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求。Http会通过TCP建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,Http会立即将TCP连接断开,这个过程是很短的。所以Http连接是一种短连接,是一种无状态的连接。(所谓的无状态,是指浏览器每次向服务器发起请求的时候,不是通过一个连接,而是每次都建立一个新的连接。如果是一个连接的话,服务器进程中就能保持住这个连接并且在内存中记住一些信息状态。而每次请求结束后,连接就关闭,相关的内容就释放了,所以记不住任何状态,成为无状态连接。)

ARC内存管理机制

  • 对于strong,在ARC下,某个对象引用计数大于0,该对象就不能销毁;一旦该对象引用计数等于0,该对象销毁;
  • 对于weak,在ARC下,weak指针不会增加其指向对象的引用计数;当其指向的对象销毁后,weak指针自动设置nil,避免出现野指针;
  • 对于copy,分浅拷贝和深拷贝;浅拷贝(对不可变对象):副本和源对象是同一个对象,源对象的引用计数加1,其本质是增加了一个指向源对象的指针;
    深拷贝(对可变对象):副本和源对象是不同的两个对象,源对象引用计数器不变,副本计数器为1;其本质是产生了新的对象;
那么copy和retain的区别是?

retain可对可变对象不可变对象同时操作,对象的引用计数器自增1,结果与浅拷贝一样,但对可变对象的操作却不能实现和copy一样的效果;

Block为什么用copy关键字?

Block在没有使用外部变量时,内存存在全局区,然而当Block使用外部变量时,内存却存在于栈区,当Block copy之后,是存在堆区的(存在于栈区的对象随时有可能被销毁);

Runtime

  • 从技术层理解
    1. runtime是一套比较底层的纯C语言API, 属于1个C语言库, 包含了很多底层的C语言API。
    2. 在我们平时编写的OC代码中, 程序运行过程时, 其实最终都是转成了runtime的C语言代码, runtime算是OC的幕后工作者 。
  • 自己的理解
    总结:首先,编译器将代码[receiver message];转化为objc_msgSend(receiver, @selector (message));,在objc_msgSend函数中。首先通过obj的isa指针找到obj对应的class。在Class中先去cache中 通过SEL查找对应函数method,若 cache中未找到。再去类的分派表中查找,若分派表中未找到,则去superClass中查找,如此一致回溯至NSObject类。若能找到,则将method加入到cache中,以方便下次查找,并跳转到对应的函数中去执行。
    链接:https://blog.csdn.net/shorewb/article/details/50756231
为什么用id修饰方法属性时,能找到方法对应的类?

id是无类型指针,是指向objc_object的结构体指针,它包含一个Class isa成员,根据isa指针可以找到对象所属的类;

字典转模型的原理

  • 所有继承于NSObject的类,都会继承NSKeyValueCoding协议,字典转模型时,需要self对象调用setValuesForKeysWithDictionary方法,底层基于runtime获取到类所有的属性,再通过setValue: forKey:来将字典中的keyValue转换为模型对应的值;

GCD

  • 队列的执行
    1.同步串行队列
    不创建新线程,按顺序执行;

    2.同步并行队列
    不创建新线程,按顺序执行;

    3.异步串行队列
    异步任务放在串行队列执行时,任务只会在一个新开的线程中,按顺序执行;

    4.异步并行队列
    异步任务放在并行队列中执行时,异步任务会在不同的线程中执行,不知道顺序;

  • 关于线程操作

// 串行队列
dispatch_queue_create
// 并行队列
dispatch_get_global_queue

1.异步子线程中调用同步主线程的方法会怎样?

 dispatch_async(...,{
   dispatch_sync(dispatch_get_main_queue,...);
 });

可以调用,没事
2.在主队列用同步函数创建任务,是会卡住的;

会卡死
 dispatch_queue_t queue = dispatch_get_main_queue();
 dispatch_sync(queue, ^{
     
 });

3.同步队列中创建同步队列(同一个),卡死;

会卡死
  dispatch_queue_t queue = dispatch_queue_create("year", DISPATCH_QUEUE_SERIAL);
    dispatch_sync(queue, ^{
        NSLog(@"同步线程%@", [NSThread currentThread]);
        dispatch_sync(queue, ^{
            NSLog(@"tong%@", [NSThread currentThread]);
        });
    });
不会卡死
 dispatch_queue_t queue1 = dispatch_queue_create("year", DISPATCH_QUEUE_SERIAL);
 dispatch_queue_t queue2 = dispatch_queue_create("year2", DISPATCH_QUEUE_SERIAL);
 dispatch_sync(queue1, ^{
     NSLog(@"同步线程%@", [NSThread currentThread]);
     dispatch_sync(queue2, ^{
         NSLog(@"tong%@", [NSThread currentThread]);
     });
 });

线程队列创建:https://blog.csdn.net/a359696929/article/details/51364040

注意:可以参考GCD队列中新线程的创建,来就线程操作的问题进行分析;
nonatomic与atomic的区别和作用?

atomic原子性,nonatomic非原子性,atomic提供多线程安全,是描述该变量是否支持多线程的同步访问,如果选择atomic,系统会自动创建lock锁,锁定变量;nonatomic禁止多线程,变量保护,提高性能(互斥锁);

你可能感兴趣的:(OC生命周期、内存管理、Runtime、GCD、Http协议与TCP协议)