IOS问题与解答

2018-01-05  本文已影响0人  Johnny_Wu

对KVO原理的理解:

问:如何手动触发一个value的KVO

答:主动调用:

willChangeValueForKey

didChangeValueForKey

问:我们知道,对属性进行赋值,触发对应值的KVO,那我们重写一个类的setter方法是,需要加入这个两个方法吗

答:不需要,因为系统默认会帮我们加上这两个方法

问:重写setter方法时候,确实没有加入上面两个方法,为什么还是可以触发KVO

答:表面上好像没有加入上面的两个方法,但系统会创建一个继承本类的类,然后再帮我们重写了setter方法,在这里就加入了上面的两个方法,然后将isa指针指向这个新创建的类,那么就相当于使用新类的实例。系统为我们创造了一个假象。

对消息事件处理的考察:

问:简单说说,消息事件内部是如何处理

答:比如点击事件吧,点击软件,产生了点击事件,然后放入到UIApplication管理的事件队列中,系统不断从队列中拿消息事件来处理。处理事件,从主窗口到子控件(从后往前遍历子控件的方式),找到事件最适合的view。找到处理的view后,就开始响应,响应处理在重写的touch回调中,没重写就交给父类处理,一直都没有touch,UIApplication不处理后就会丢弃。

问:考察消息传递。如果在一个view上点add子viewA,再add子viewB,你不是说查找最适合view的时候,会找子view吗,上面那种情况,如果我点击了viewA,会如何查找?

答:从后往前遍历子控件的方式,所以会先在viewB查找,再到viewA,然后发现A是最适合的view,直接返回。

问:考察消息响应。如何让子View和父view都可以响应消息

答:在子view的touch回调总,调用父类的touch同方法

问:如果我点击按钮,想让按钮的父类也可以响应这个事件,如何做

答:继承button,然后重写 super touch方法(使btn可以响应),和[super superview] touch方法(使btn的父view可以响应)

考察runLoop

问:简单说说你对runLoop的理解,如果有答到有等待,然后消息过来就被唤醒处理,就继续问它是会一直等待吗,还是说也会返回,不再等待

如果没有监听事件源,就不会再等待,比如说在一个线程里只有一个非循环的定时器,只要处理了本次定时器,就不再等待。

问:如何在非主线程中添加定时器

问:刷scrollView时,timer停止计时,怎么解决

如何理解oc的运行时机制Runtime

对应上消息机制,不是在编译的时候,而是在运行时候才确定函数的调用等,因为很多东西在运行时候才确定,所以,在运行之前,我们还可以进行修改,包括方法的重定向,方法交互,添加成员属性等

1、消息发送

2、方法交换 method_exchangeImplementations

3、动态添加方法,重定向方法

4、给分类添加属性成员(在类别中添加属性成员)objc_getAssociatedObject和objc_setAssociatedObject

5、可以动态获取类的属性成员变量(运用在准确的字典转mode等),先获取模型的成员属性,然后看看字典里面有没这个字段,如果没有,就不进行赋值,防止找不到而报错

上一篇下一篇

猜你喜欢

热点阅读