如何在Objective-C中将readonly属性转换为readwrite属性?
发布时间:2020-12-16 04:52:11 所属栏目:百科 来源:网络整理
导读:在Objective-C中将readonly属性转换为readwrite属性的方法有哪些?请记住,我无法访问源代码. 原因:我需要在单元测试中进行此操作以进行模拟. 解决方法 如果没有访问类的主要实现块,或者至少包含它的编译单元,则无法更改此属性的功能,因为您无法访问该单元外
在Objective-C中将readonly属性转换为readwrite属性的方法有哪些?请记住,我无法访问源代码.
原因:我需要在单元测试中进行此操作以进行模拟. 解决方法
如果没有访问类的主要实现块,或者至少包含它的编译单元,则无法更改此属性的功能,因为您无法访问该单元外的ivar.即使你要在一个类别中为类添加一个setter,你也不可能完全影响类的存储,而不是完全在类之外.
但是,您可以使用KVC. setValue:forKey:如果可以找到一个,它将绕过setter并直接进入ivar.您可以使用它来设置您喜欢的任何值,即使是已经声明为readonly的属性,前提是您知道其名称的后备存储. 它是这样的: //Passaquisset.h #import <Foundation/Foundation.h> @interface Passaquisset : NSObject @property (copy,readonly,nonatomic) NSString * vanadium; @end //Passaquisset.m #import "Passaquisset.h" @implementation Passaquisset @synthesize vanadium; - (id) init { self = [super init]; if( !self ) return nil; vanadium = @"Number 23"; return self; } @end //Elsewhere... #import <Foundation/Foundation.h> #import "Passaquisset.h" int main(int argc,const char * argv[]) { @autoreleasepool { Passaquisset * pq = [Passaquisset new]; NSLog(@"%@",[pq vanadium]); [pq setValue:@"Number 24" forKey:@"vanadium"]; NSLog(@"%@",[pq vanadium]); } return 0; } 就像我说的那样,这会失败 – 实际上会引发一个异常 – 如果既没有一个setter也没有一个同名的ivar(或者附加一个下划线_vanadium(KVC非常聪明),比如该属性的值是完全计算的: //Passaquisset.m #import "Passaquisset.h" @implementation Passaquisset /** KVC will fail with this version! **/ - (NSString *)vanadium { return @"Number 23"; } @end 为了完整起见,我要提一下,如果该属性由一个完全不同名称的ivar支持(例如@synthesize vanadium = erythronium;),您需要知道ivar的名称才能使用KVC. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 重构 — 改善既有的类图设计 条款12:消除聚合内部的返回参
- 谁能为c推荐一个好的数据包嗅探器类?
- oracle数据库scott用户下emp和dept表数据
- ruby-on-rails – Ruby BigDecimal Round:这是一个错误吗?
- ajax – SlickGrid垂直滚动条无法正常显示,除非显示/隐藏过
- c# – 可以在“using”语句中为Web请求嵌入“try / catch”
- c# – 如何从XmlReader创建XML文件?
- .net – ServiceConfiguration.cscfg中的自定义/嵌套XML设置
- c# – System.IO.IOException:—– END RSA PRIVATE KEY未
- 在多标签分类中,准备mulan开源软件所需要的.arff和.xml数据
推荐文章
站长推荐
- Electron 和 NW.js (原名 node-webkit) 在技术上
- TQ2440 使用Jlink-Flasher 烧写 u-boot 或者 pro
- Swift学习笔记(十四)——字符,常量字符串与变
- cJSON库解析
- c# – BinaryFormatter.Serialize(Image) – Ext
- Flex中DataGrid中添加一列复选框(CheckBox)
- c# – 有没有办法将通过TaskCompletionSource驱动
- ajax交互Struts2的action(1)
- 如何使用Npgsql和OrmLite定义’geography’类型(
- 如何使用Objective-C创建文字XML字符串?
热点阅读