美文网首页
扎实iOS基础知识

扎实iOS基础知识

作者: zhouluyao | 来源:发表于2020-04-17 11:01 被阅读0次

    什么情况使用 weak 关键字,相比 assign 有什么不同?

    weak相比assgin的不同:weak只能修饰oc对象类型,assgin还可以修饰基本数据类型,都是非持有关系,设置方法不释放旧值,不设置新值,weak修饰的对象释放时指针置为nil,assgin修饰的对象不置为nil,调用时可能会crash.

    什么情况使用 weak 关键字?

    在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如: delegate 代理属性

    不同点

    copy 关键字在哪些场景使用?

    方法内部的 block 是在栈区的,使用 copy 可以把它放到堆区.在栈区的block出了作用域就释放了,这时可能还没有回调

    为什么NSString不用Strong修饰,要用Copy修饰?

    如果NSString用Strong修饰,它的子类NSMutableString可以给它赋值,这两个变量就指向了同一个内存,NSMutableString改变时NSString也会跟着改变,原则上是不允许的,如果用Copy修饰NSString,子类NSMutableString给它赋值时会进行深拷贝,两个指向不同的内存,即使NSMutableString改变了NSString也不会跟着改变

    如何实现给分类添加成员变量?

    OC的分类允许给分类添加属性,但不会自动生成getter、setter方法。通过关联对象生成getter,setter方法

    因为分类底层结构的限制,不能添加成员变量到分类中。但可以通过关联对象来间接实现

    //添加关联对象
    void objc_setAssociatedObject(id object, const void * key,
                                    id value, objc_AssociationPolicy policy)
    //获得关联对象
    id objc_getAssociatedObject(id object, const void * key)
    

    关联对象并不是存储在被关联对象本身内存中

    关联对象存储在全局的统一的一个AssociationsManager中

    关联对象底层实现的结构:

    AssociationsManager中通过HashMap,key中存储的是对象,value对应的是HashMap

    hash表中存放的就是key和value,设置关联对象为nil时就相当于移除了关联对象

    runtime是如何实现 weak 变量的自动置nil?

    weak 对象会放入一个 hash 表中。用 weak 指向的对象内存地址作为 key,当此对象的引用计数为0的时候会 dealloc。

    赋值对象的内存地址作为键值key,被赋值对象的内存地址作为Value,当赋值对象为0(nil),那么被赋值的内存地址从weak表中删除,假如 weak 指向的对象内存地址是addr,那么就会以addr为键, 在这个 weak 表中搜索,找到所有以addr为键的 weak 对象,从而设置为 nil。一个weak对象可能赋值给了多个对象.

    对象最好使用weak修饰,而不是使用assign的原因?

    此时向weakPo发送消息不会崩溃:在Objective-C中向nil发送消息是安全的。

    而如果a是由 assign 修饰的,则: 在 b 非 nil 时,a 和 b 指向同一个内存地址,在 b 变 nil 时,a 还是指向该内存地址,变野指针。此时向 a 发送消息极易崩溃。

    多线程GCD和NSOperation的区别?

    1、GCD是c语言的API,NSOperation是面向对象的方法

    2、NSOperation能够取消准备执行还没执行的任务,GCD不能取消Block的任务

    3、NSOperation能够设置依赖

    4、可以通过KVO监听NSOperation的执行状态

    5、NSOperation可以设置任务的优先级

    6、NSOperation可以被继承,可以添加一些变量和方法

    你用的什么对称加密

    加盐的目的是加强加密的复杂度,这么破解起来就更加麻烦,当然这个“盐”越长越复杂,加密后破解起来就越麻烦,不信加盐后然后MD5加密,再去到md5破解网站破解试试看,他就没辙了!!!

    AES(Advanced Encryption Standard):高级加密标准,目前美国国家安全局使用的,苹果的钥匙串访问采用的就AES加密。是现在公认的最安全的加密方式,是对称密钥加密中最流行的算法。

    如果有同名的分类先调用哪一个?

    调用后编译的,因为合并方法时是插在前面的

    使用URL Encode原因

    1、当字符串数据以URL的形式传递给WEB服务器时,字符串中是不允许出现空格和特殊字符的

    2、因为 URL 对字符有限制,比如把一个邮箱放入 URL,就需要使用 URL Encode 函数,因为 url 中不能包含 @ 字符。

    3、URL转义其实也只是为了符合URL的规范而已。因为在标准的url规范中中文和很多的字符是不允许出现在URL中的。(主要就是消除服务器解析url时的异常)

    解决的办法

    就是对参数进行URL编码,URL编码只是简单的在特殊字符的各个字节前加上%

    MVVM架构的核心思想

    从控制器中把业务处理相关的代码,网络下载,字典转模型等相关的代码拿出去处理,处理完之后用一个block回调给控制器,ViewModel并不拥有任何的View,不拥有View的好处就是ViewModel是可以重用的,谁需要都可以拿去用

    相关文章

      网友评论

          本文标题:扎实iOS基础知识

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