SDK中的readonly&readwrite
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SDK中的readonly&readwrite相关的知识,希望对你有一定的参考价值。
参考技术A readonly 关键字用于属性的存取控制 ,如果不使用readonly ,编译器默认属性关键字为 readwrite。就如字面意思一样,我们不想让外部调用的时修改此属性,而只允许获取属性值。
在.h中
在.m中
我们可以看到,在Person类的.m文件中可以读写testName属性了。
打印结果是:
是不是惊奇的发现KVO居然修改了readonly的textName属性,But Why?下面我们就详细分析下:
当使用 setValue:forKey: 来设置对象的属性时,会以下面的优先顺序来寻找对应的 key:
1、消息接收对象会查找是否存在满足set<key>:格式的存取方法。
2、如果不存在满足条件的存取方法,且消息接收对象的类方法 + (BOOL)accessInstanceVariablesDirectly返回 YES,那么该对象会以 _<key>, _is<Key>, <key>, is<Key> 的顺序查找是否存在对应的key。
3、如果存在对应的存取方法或者找到对应的实例变量,那么就会改变该 key 所对应的值 value。必要的话,value 所对应的值会从对象中解析出来。
4、如果没有找到对应的存取方法或者实例变量,那么该消息对象的 setValue:forUndefinedKey: 将会被调用。
这样,在走到第2步的时候,就完成了对属性的修改。
重写其类方法 + (BOOL)accessInstanceVariablesDirectly 返回 NO (该方法默认返回 YES,即在不存在满足条件的存取方法时,允许直接访问属性对应的实例变量);在搜索实例变量时,会首先检查带下划线的实例变量,然后检查不带下划线的实例变量。
在person类中添加方法,然后再通过KVC方法修改:
注意:如果我们在.m内部重写了属性的readwrite,那么通过KVC还是可以修改person类内部的属性值,除非我们并未重写属性的readwrite,那么此时上面的设置是有效的,只不过我们Person内部也无法修改属性了
屏蔽重写之后,KVC并没有成功修改只读属性值,打印如下:
这里就分两种情况了:
1、只是在.h文件中声明的只读属性,而.m中没有重写读写属性,那么删除掉readonly修饰是可以修改属性的。
2、如果在.m中重写了读写属性,那么删除掉.h中修饰属性的readonly时, 会报错 ,错误提示非法重新声明,主属性必须是readonly。
Person在.中属性设置只读,.m中不再重写。如果使用self.testName调用就会报只读的错,但是如果使用_testName调用就没问题,而且使用_testName可以重新赋值。为什么换成下滑下调用就可以重新赋值呢?
不要忘记,我们在声明一个 textName 的属性时,编译器会为我们自动合成一个 _textName 的实例变量,这样我们就可以通过_textName修改值了 。
Person暴露的test方法调用,改变只读属性的值:
资料来源
Demo
使输入框(input & textarea)变为只可读状态readonly="readonly",禁用输入框disabled="disabled&qu
使输入框变为只可读状态
readonly="readonly"
<input class="select-city" placeholder="请选择身份" readonly="readonly">
禁用输入框
disabled="disabled"
<input type="text" value="" disabled="disabled" placeholder="请输入姓名">
$("input,textarea") .attr("disabled", "disabled");
移除禁用
$("input,textarea").removeAttr("disabled");
以上是关于SDK中的readonly&readwrite的主要内容,如果未能解决你的问题,请参考以下文章
使输入框(input & textarea)变为只可读状态readonly="readonly",禁用输入框disabled="disabled&qu
Chisel3 - bind - Op, ReadOnly, 左值
一把双刃剑 -- 融云即时通讯sdk中的自定义消息使用心得&指南 (下)