美文网首页
IOS开发 基础学习

IOS开发 基础学习

作者: 余立徽 | 来源:发表于2017-12-18 16:00 被阅读0次

    1、TAG

    2、alloc  init

    3、堆栈

    4、atomic、nonatomic

    5、__block、__weak、__strong

    6、delegate、KVO、通知    的区别

    7、KVO、KVC

    8、SDWebImage

    9、https 的介绍

    10、TCP的三次握手

    1、TAG

    - (nullable __kindof UIView *)viewWithTag:(NSInteger)tag; // recursive search. includes self

    [UIView viewWithTag:10]; 这种类型 通过 tag 去获取一个子控件 我们经常使用,那怎么实现的呢。看到注释我们看到了,是通过递归的方式去在当前的控件去一个一个找到对应tag值的子控件,找到第一个就结束。首先是从自身开始。也就是说 说过自身控件的 tag 跟子控件的 tag 也不能够重复,不然则返回的为自己本身,这个是开发过程中需要注意到的一点。

    2、alloc  init

    MyClass* myObj = [MyClass alloc]  init];

    alloc 开辟内存空间,并且把地址返回给指针,alloc 后该内存空间还不能被使用,所以需要 init 初始化这块内存空间,才可以使用这块内存空间。

    3、堆栈

    栈区:由编译器自动分配并释放,存放函数的参数值,局部变量等。栈是系统数据结构,对应线程/进程是唯一的。优点是快速高效,缺点是有限制,数据不灵活 。[先进后出]

    栈空间分 静态分配 和 动态分配 两种。

    静态分配是编译器完成的,比如自动变量(auto)的分配。 动态分配由alloca函数完成。 栈的动态分配无需释放(是自动的),也就没有释放函数。 为可移植的程序起见,栈的动态分配操作是不被鼓励的。

    堆区:有程序员分配和释放,如果程序员不释放,程序结束时,可能会被操作系统回收。比如:alloc 的内存都是放在推里。优点是灵活方便,但是效率低

    4、atomic、nonatomic

    1、atomic、nonatomic 相当于 set / get 方法

    atomic:提供多线程安全,是描述该变量是否支持多线程的同步访问,如果选择了atomic 那么就是说,系统会自动的创建lock锁,锁定变量。性能减少。[效率低,速度慢]

    nonatomic:禁止多线程,变量保护,提高性能。如果该对象无需考虑多线程的情况,请加入这个属性,这样会让编译器少生成一些互斥加锁代码,可以提高效率,但是线程不安全。[效率高,速度快 ]

    2、assign

    assign:修饰基本数据类型,比如 float int 等基本数据类型,修饰的内容存放在栈里面。

    3、copy、strong

    copy:复制对象,在数据更改的时候,保证之前被复制的对象不被更改。

    NSString * string1 = @"abc";

    NSString * string2 = string1copy;

    string2 = @"abcde";

    string2 是 string1 copy 而来,则 后面 string2 值发生改变的时候则 string1的值 不会发生改变。 在copy的时候 内存 重新给 string2 分配了内存空间,内存地址指向string2。所以string2 的值发生改变不会影响string1 的变化。如果不用 copy 深拷贝。

    NSString * string2 = string1;

    这样的话,是 string1 赋值 给 string2,string2 指向的 跟 string1 指向的内存地址 是同一块地址,则一个值方式改变就会影响另一个值发生变化。

    strong:复制对象时,被复制的对象会跟着 复制的对象改变而改变。

    5、__block、__weak、__strong

    __weak: 弱引用,引用的对象的计数 不会加一 , __weak 修饰的变量,当其他地方的变量被释放之后,block 中的变量 也会被释放掉。如果block 中用 __strong 去修饰,则不会被释放掉,知道 block 执行结束之后才会被释放。

    例如:

    1        __weak currentViewController *weakSelf = self;

    2        dispatch_async(dispatch_get_global_queue(0,0), ^{

    3        __strong currentViewController *strongSelf = weakSelf;

    4        for (NSInteger i = 0; i < 100; i++) {

    5                NSLog(@"%@",strongSelf);

    6                sleep(1);

    7        }

    8        });

    【注意】:第1行 也可以使用 __weak __typeof(&*self) weakSelf = self;  等同于的。

    上面代码中 在 currentViewController 中添加如上代码。在 pop 回到上一个页面的话,当前的 currentViewController 是不会被释放的,currentViewController 中添加的方法 -(void)dealloc; 也是不会被调用的,直到 block 中的代码执行结束之后 才会走  -(void)dealloc 方法,释放当前 Controller 。如果我们我们把上面的 第三行代码:__strongcurrentViewController*strongSelf = weakSelf; 注释掉的话,则在pop回到上一个页面, 则 currentViewController 会立即调用  -(void)dealloc; 方法。释放当前的 Controller 。

    如果我们把 第一行代码:__weak currentViewController *weakSelf = self; 注释掉,第五行改为:NSLog(@"%@",self);, 则同样 是不会释放掉,需等block 执行完成 才会释放  currentViewController;所以我们在使用 block 的是否 需要注意 去使用 __weak 去修饰。防止离开当前页面,没法进行销毁掉。

    __block 与 __weak的区别:在 block 中修改 局部变量的 值,需要 需要 __block 进行修改才可以进行更改,不能使用 __weak 修饰。

    weak 弱引用,很多弱引用的对象会放到一个容器中来管理,一个对象可能会被多次弱引用,弱引用的地址会放到一个容器里。当对象不再被强引用的时候 在释放的时候,从容器中找到这个对象所有的弱引用,将其小孩,置为 nil 。

    6、delegate、KVO、通知    的区别

    delegate:使用代理,就必须执行代理中 必须要实现的方法。代理可以是任何一个类型的对象。需要执行的方法,传递的参数已经参数的类型,需要在delegate协议中明确的定义清楚。但是协议 必须在 Controller 的作用域范围内定义。能够接受协议方的返回值。delegate的定义 需要用 weak 修饰,不然delegate 。

    通知:一对多的实现,发起一个通知,可以对多处 注册有该通知的 都会被通知到。检查不了通知是否被通知到。释放的时候,需要手动在通知中心取消注册。与delegate相比 更难以跟踪。通知后不能从观察者获取任何反馈信息。

    KVO:两个对象之间保持同步的一种方法。当一个对象发送变化,观察对象就马上做出反应。他只能对属性做出反应,不能使方法。可以知道 观察的属性改变前后的值。

    7、KVO、KVC

    KVC 作用是修改属性的值,KVO 可以监听 一个对象 属性值改变情况。

    当一个对象调用setValue:forKey: 方法时,方法内部会做以下操作:

    1.判断有没有指定key的set方法,如果有set方法,就会调用set方法,给该属性赋值

    2.如果没有set方法,判断有没有跟key值相同且带有下划线的成员属性(_key).如果有,直接给该成员属性进行赋值

    3.如果没有成员属性_key,判断有没有跟key相同名称的属性.如果有,直接给该属性进行赋值

    4.如果都没有,就会调用 valueforUndefinedKey 和setValue:forUndefinedKey:方法

    KVO: 是基于 runtime 机制实现的。当一个对象(假设是person对象,对应的类为 JLperson)的属性值age发生改变时,系统会自动生成一个继承自JLperson的类NSKVONotifying_JLPerson,在这个类的 setAge 方法里面调用。当观察对象A时,KVO机制动态创建一个新的名为:NSKVONotifying_A的新类,该类继承自对象A的本类,且 KVO 为 NSKVONotifying_A 重写观察属性的 setter 方法,setter 方法会负责在调用原 setter 方法之前和之后,通知所有观察对象属性值的更改情况。

    [super setAge:age];

    [self willChangeValueForKey:@"age"];

    [self didChangeValueForKey:@"age"];

    三个方法,而后面两个方法内部会主动调用

    -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context方法,在该方法中可以拿到属性改变前后的值.

    添加的 KVO 需要在 dealloc 中进行移除。[xx removeObserver:self forkeyPath:@"text" content:nil];

    8、SDWebImage

    SDWebImage底层实现有沙盒缓存机制,主要有三块组成

    1、内存图片缓存

    2、内存操作缓存

    3、磁盘沙盒缓存

    首先从内存中查找是否有图片缓存,如果有就直接显示,如果没有

    就生成 NSInvocation 添加到 队列中从硬盘中查找图片是否有缓存,有就将图片 添加到内存缓存中。如果都没有有

    就生成一个下载器 SDWebImageDownloader 开始下载图片。下载完成的图片 同时添加到内存缓存和硬盘缓存中,

    写入 硬盘单独 用NSinvocationOperation 完成,避免拖慢主线程。

    9、https 的介绍

    HTTPS(HTTP over SSL,实际上是在原有的 HTTP 数据外面加了一层 SSL 的封装。HTTP 协议原有的 GET、POST 之类的机制,基本上原封不动),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容请看SSL。【 https = http + ssl 】

    两种基本的加解密算法类型

    对称加密:

    密钥只有一个,加密解密为同一个密码,且加解密速度快,典型的对称加密算法有DES、AES等。

    非对称加密:

    密钥成对出现(且根据公钥无法推知私钥,根据私钥也无法推知公钥),加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密),相对对称加密速度较慢,典型的非对称加密算法有RSA、DSA等。

    HTTP下加入SSL层,来保证数据传输的安全,

    http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

    劣势

    对数据进行加解密决定了它比http慢

    需要进行非对称的加解密,且需要三次握手。

    首次连接比较慢点,当然现在也有很多的优化。

    10、TCP的三次握手

    第一次握手:客户端发送syn(syn=j)包到服务器,并进入syn_send状态,等待服务器进行确认;

    第二次握手:服务器收到客户端的syn包,必须确认客户的SYN(ack = j + 1),同时自己也发送一个SYN包(syn = k),即SYN + ACK包,此时服务器进入SYN_RECV状态;

    第三次握手:客户收到服务器发送的SYN+ACK包之后,向服务器发送确认包(ACK = k + 1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成第三次握手。

    待更新 ...

    相关文章

      网友评论

          本文标题:IOS开发 基础学习

          本文链接:https://www.haomeiwen.com/subject/obsmwxtx.html