1、KVC 和 KVO
· KVC(key-value-coding键值编码,跟多情况下会简化程序代码)的常见用法:
·· 给私有变量(该变量不对外开放)赋值:[Person setValue: @”19” ForKeyPath:@”age”]
·· 字典转模型:setValuesForKeyWithDictionary
·· 取出私有变量:[Person valueForKey:@”age”]
·· 没有找到对应的key会崩溃:重写setValueForUndefinedKey
· KVC缺点:一旦使用KVC,编译器无法检查出错误,即不会对设置的键、键路径进行错误检查,且执行效率低于自定义的setter和getter方法,因为使用KVC键值编值,必须先解析字符串,然后设置或访问对象的实例变量
· 通过KVO(key-value-observing,典型的观察者模式,被观察的对象必须使用KVC键值编码来修改它的实例变量,这样才能被观察者观察到)监听person对象中name属性发生改变
·· 给监听的属性设置一个观察者:
[self.person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
·· 当person的name的值发生改变时,就会执行该方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
do something....
}
· 当一个类的属性被观察的时候,系统会通过runtime动态的创建一个该类的派生类,并且会在这个类中重写基类被观察的属性的setter方法,而且系统将这个类的isa指针指向了派生类(NSNotifying_类名),从而实现了给监听的属性赋值时调用的是派生类的setter方法。重写的setter方法会在调用原setter方法前后,通知观察对象值得改变。
2、@synthesize和@dynamic区别是什么
· 这两个关键字都是@property对应的词
· @synthesize 语义是如果没有手动实现setter和getter方法,那么编译器会自动帮你加上这两个方法
· @dynamic告诉编译器,属性的setter和getter由用户自己实现,不自动生成(readOnly只实现getter即可),但是如果没有自己实现,编译的时候不会报错,运行的时候就会报错,这就是所谓的动态绑定
3、谈谈时间响应链的一般顺序
· 一般来说,第一响应者是个视图对象或者其他子类对象,当其被触摸以后事件便交由他处理,如果他不处理,时间就会被传递给它的视图控制器对象viewController(如果存在),然后是它的父视图对象(superView)(如果存在),依次类推,直到顶层视图,接着沿着顶层视图(topView)到窗口(UIWindow对象)再到程序(Application对象)。如果整个过程都没有响应这个事件,该事件就会被抛弃。一般情况下,在响应链中只要有对象响应那个处理事件,事件就会停止传递
4.1、post和get方式的区别
· GET请求的数据会负载URL之后,即把数据放在HTTP协议头中,以?区分URL和传输数据,参数之间以&相连,英文字母/数字,原样发送,如果是空格,转化为+,如果是中文,把字符串用BASE64加密;POST就是把提交的数据放在HTTP包的包体中
· GET一般用于提交少量数据(最多提交1k,浏览器限制),POST用于提交大量数据(理论上无限制,收服务器限制)
· GET提交的数据可以在浏览器历史记录中看到,安全性不好,别人可以拿到账号密码
· Get是向服务器发索取数据的一种请求,而POST是向服务器发提交数据的一种请求,只是发送机制不同
· GET不可以设置书签,POST可以设置书签
· 什么情况下用POST:
·· 请求的结果具有持续性副作用,如数据库添加新的数据行
·· 若使用get方法,则表单上手机的数据可能让URL过长
·· 要传送的数据不是采用7位的ASCII编码
· 什么情况下用GET:
·· 请求是为了查找资源,HTML表单数据仅用来帮助搜索
·· 请求结果无持续副作用性的副作用
·· 手机的数据及HTML表单内的输入字段名称的总长不超过1024个字符
4.2、POST和PUT区别
· POST请求的url表示处理该封闭实体的资源,该资源可能是个数据接收过程、某种协议的网关、或者接收注解的独立实体。
· PUT请求中的url表示请求中封闭的实体-用户代理知道url的目标,并且服务器无法将请求应用到其他资源。如果服务器希望该请求应用到另一个url,就必须发送一个301响应;用户代理可通过自己的判断来决定是否转发该请求。
· POST是用来提交数据的。提交的数据放在HTTP请求的正文里,目的在于提交数据并用于服务器端的存储,而不允许用户过多的更改相应数据(主要是相对于在url 修改要麻烦很多)。
· PUT操作是幂等的。所谓幂等是指不管进行多少次操作,结果都一样。比如我用PUT修改一篇文章,然后在做同样的操作,每次操作后的结果并没有不同
· POST操作既不是安全的,也不是幂等的,比如常见的POST重复加载问题:当我们多次发出同样的POST请求后,其结果是创建出了若干的资源。
· 安全和幂等的意义在于:当操作没有达到预期的目标时,我们可以不停的重试,而不会对资源产生副作用。从这个意义上说,POST操作往往是有害的,但很多时候我们还是不得不使用它。
· 还有一点需要注意的就是,创建操作可以使用POST,也可以使用PUT,区别在于POST 是作用在一个集合资源之上的,而PUT操作是作用在集合的一个具体资源之上的,再通俗点说,如果URL可以在客户端确定,那么就使用PUT,如果是在服务端确定,那么就使用POST,比如说很多资源使用数据库自增主键作为标识信息,而创建的资源的标识信息到底是什么只能由服务端提供,这个时候就必须使用POST。
5、深复制和浅复制
· 非集合类对immutable对象进行copy操作,是指针复制,mutableCopy操作时内容复制
· 非集合类对mutable对象进行copy和mutableCopy都是内容复制。
· 在集合类对象中,对immutable对象进行copy,是指针复制,mutableCopy是内容复制
· 在集合类对象中,对mutable对象进行copy和mutableCopy都是内容复制。但是:集合对象的内容复制仅限于对象本身,对象元素仍然是指针复制。
· NSString *str = @”string”; str = @”newString”; 打印对象地址,发现是发生变化的,需要把@”newStirng”当做一个新的对象,将这段对象的内存地址赋值给str