iphone – 使用NSMutableDictionary作为属性的后备存储

iphone – 使用NSMutableDictionary作为属性的后备存储,第1张

概述我正在寻找一种简单的方法来将我的属性直接设置为NSMutableDictionary,它是一个实例变量.即: KVCModle.h: @interface KVModel : NSObject { NSMutableDictionary * data;}@property(nonatomic,assign)NSString * string1;@property(nonatomic, 我正在寻找一种简单的方法来将我的属性直接设置为NSMutableDictionary,它是一个实例变量.即:

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.foo = foo等代码访问属性,那就是它无效的原因.

属性访问语法与消息语法同义;前者与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作为属性的后备存储所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1008294.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存