1. 怎么修改只读(readonly)属性变量
使用KVC可以修改 kvc就是键值编码(key-value),可以通过指定的key获得想要的值value,而不是通过调用 Setter,Getter 方法访问
2.KVO 除了能观察属性外,能不能观察对象
不能观察对象
KVO,即 Key-Value Observing, 它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察者的对象的属性被修改后,KVO就会自动通知相应的观察者了
KVO是一个对象能过观察另外一个对象的属性的值,并且能够发现值的变化。这是一个对象与另一个对象保持同步的一种方法,即当另一种对象的状态发生改变时,观察对象马上做出反应。它只能用来对属性做出反应,而不会用来对方法或者动作做出反应。
实现原理:当为某个对象属性注册监听的时候,该对象的 isa 指针就会指向一个中间类,而不是本来对象真实的类。所以说,对象的 isa 指针可以改变,我们的程序最好不要依赖 isa 指针。
简言而之就是:
1.当一个 object 有观察者时没动态创建这个 object 的类的子类
2.对于每一个被观察的 property, 重写其 set 方法
3.在重写的 set 方法中调用- willChangevalueForKey:和- didChangevalueForKey:通知观察者
4.当一个 property 没有观察者时,删除重写方法
5.当一个 boserver 观察任何一个 property 时,删除动态创建的子类
3.block里面能不能修改静态变量
能 __block 可以 ---> 为什么要用__block
你可以指定引入一个变量为可更改的,即读-写的,通过应用__block存储类型修改修饰符。
局部变量的.__block的存储和register,auto,static等存储类型相似,但它们之间不兼容。
__block 变量保存在变量共享的作用域范围内,所有的 blocks 和 block 副本都声明或创建在和变量的作用于相同范围内。所以,如果任何 blocks 副本声明在栈内并未超出栈的结束时,该存储会让栈帧免于被破坏(比如封装为以后执行)。同一作用域范围内给定的多个 block 可以同时使用一个共享变量作为一种优化, block 存储在栈上面,就像blocks本身一样。如果使用 Block_copy 拷贝了 block 得一个副本(或者在 objective-C里面给 block 发送了一条 copy 消息),变量会被拷贝到堆上面。所以一个__ block 变量的地址可以随时间推移而更改。
使用 __block的变量有两个限制:
1.它们不能是可变长的数组
2.它们不能是包含有 C99可变疮毒的数组变量的数据结构