KVCModle.h:
@interface KVModel : NSObject { NSMutableDictionary * data;}@property(nonatomic,assign)Nsstring * string1;@property(nonatomic,assign)Nsstring * string2;@end
KVCModel.m
#import "KVModel.h"@implementation KVModel-(ID)init{ self = [super init]; if(self) { data = [[NSMutableDictionary alloc] init]; } return self;}-(Nsstring *)string1{ return [data objectForKey:@"string1"];}-(Nsstring *)string2{ return [data objectForKey:@"string2"];}-(voID)setString1:(Nsstring *)_string1{ [data setobject:_string1 forKey:@"string1"];}-(voID)setString2:(Nsstring *)_string2{ [data setobject:_string2 forKey:@"string2"];}-(voID)dealloc{ [data release]; [super dealloc];}@end
我试图覆盖setValue:ForKey:和valueForKey:,但是没有调用它们,它们允许您直接设置属性而不使用属性语法.
我已经制作了预处理器宏来完成这项工作,但我根本不打算输入,并且希望将来尽可能多地避免使用它.有没有办法让我不熟悉这项工作?
我曾考虑使用NSManagedobject,但我不确定我能不能得到我想要的东西.
编辑:
source
属性访问语法与消息语法同义;前者与foo = [obj foo]完全相同,后者与[obj setFoo:foo]完全相同.没有KVC代码可以拦截.属性属于语言级别; KVC处于框架层面.
您需要拦截访问者消息.考虑实现the resolveInstanceMethod:
class method,您可以通过使用Objective-C运行时API向该类添加方法实现来“解析”选择器.您可以为许多不同的选择器添加相同的实现.
为了您的目的,有一个检查选择器的函数或方法(使用NsstringForSelector和常规Nsstring检查技术)并返回两个事实:(1)属性名称,以及(2)它是否是getter(foo,isFoo)或setter (setFoo :).然后,有两个方法,一个是动态getter,另一个是动态setter.当选择器命名一个getter时,使用dynamic-getter方法添加它;当选择器命名一个setter时,使用dynamic-setter方法添加它.
那么dynamic-getter和-setter方法如何工作呢?他们需要知道动态获取和设置什么属性,但是他们还需要不带参数(getter)或一个参数(setter,它取值),以匹配原始的属性访问消息.您可能想知道这些通用实现如何知道要获取或设置的属性.答案是:它在选择器中!用于发送消息的选择器作为隐藏参数_cmd传递给实现,因此以与以前相同的方式检查该选择器,以提取应动态获取或设置的属性的名称.然后,动态getter应该发送[data objectForKey:keyExtractedFromSelector],动态setter应该发送[data setobject:newValue forKey:keyExtractedFromSelector].
两个警告:
>当您使用property-access语法访问尚未在类的@interface中声明的“属性”时,您仍可能会收到编译器的投诉.这是正常的和有意的;你真的应该使用属性访问语法来访问已知的形式属性.你在做什么,虽然我发现解决它很有趣,但从技术上来说是滥用属性访问语法.>这仅适用于对象值. KVC对原始值进行装箱和拆箱,例如整数;由于KVC没有参与,没有免费拳击和拆箱.如果您已声明正式属性(请参阅1),则需要使用Objective-C运行时API对它们进行内省,并自行完成装箱和拆箱.
总结以上是内存溢出为你收集整理的iphone – 使用NSMutableDictionary作为属性的后备存储全部内容,希望文章能够帮你解决iphone – 使用NSMutableDictionary作为属性的后备存储所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)