什么情况使用 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是可以重用的,谁需要都可以拿去用
网友评论