首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >发送给实例的不可识别的选择器:键值对

发送给实例的不可识别的选择器:键值对
EN

Stack Overflow用户
提问于 2013-09-25 10:47:55
回答 1查看 346关注 0票数 0

我得到了

代码语言:javascript
复制
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSDictionaryM metadata]: unrecognized selector sent to instance 0xd0b6250'

当我到达并执行代码的这一部分时:

代码语言:javascript
复制
IDTherapyMetadata* meta = [self.dataCon getMetaDataFromId:content.metadata];

dataCon中的方法如下所示:

代码语言:javascript
复制
-(IDTherapyMetadata*)getMetaDataFromId:(NSString*)metaDataId
{
for (IDTherapyMetadata* metadata in self.parser.metadata)
{
    if([metaDataId compare:metadata.objId] == NSOrderedSame)
    {
        return metadata;
    }
}
return nil;

}

奇怪的是,如果我写

代码语言:javascript
复制
IDTherapyMetadata* meta = [self.dataCon getMetaDataFromId:[content valueForKey:@"metadata"]];

相反,它工作得很好。

然而,我希望能够使用点符号,并查看苹果的文档,https://developer.apple.com/library/ios/documentation/cocoa/conceptual/KeyValueCoding/Articles/BasicPrinciples.html并没有帮助我。

为什么我会有这种行为,我该如何解决呢?

任何帮助都是非常感谢的。

编辑:IDTamyContents.h的代码:

代码语言:javascript
复制
#import <Foundation/Foundation.h>


@interface IDTherapyContents : NSObject 
@property (nonatomic, copy)NSString* urlId;
@property (nonatomic, copy)NSString* url;
@property (nonatomic, copy)NSString* type;
@property (nonatomic, copy)NSString* timestamp;
@property (nonatomic, copy)NSString* metadata;
@property (nonatomic, copy)NSString* lang;
@property (nonatomic, copy)NSString* objId;

//methods
-(id)initWithJsonDic:(NSDictionary*)jsonDic;

@end

IDTherpayMetaData.h代码

代码语言:javascript
复制
    #import <Foundation/Foundation.h>

#import "IDTherapyImages.h"

@interface IDTherapyMetadata : NSObject 

//Array contains 'String' objects
@property (nonatomic, strong)NSMutableArray* thumbnails;
@property (nonatomic, copy)NSString* title;
@property (nonatomic, copy)NSString* timestamp;
@property (nonatomic, copy)NSString* subCategory;
@property (nonatomic, copy)NSString* lang;
@property (nonatomic, copy)NSString* objId;
@property (nonatomic, copy)NSString* description5;
@property (nonatomic, copy)NSString* description4;
@property (nonatomic, copy)NSString* description3;
@property (nonatomic, copy)NSString* description2;
@property (nonatomic, copy)NSString* description1;
@property (nonatomic, copy)NSString* category;

//Array contains 'IDTherapyImages' objects
@property (nonatomic, strong)NSMutableArray* images;

//methods
-(id)initWithJsonDic:(NSDictionary*)jsonDic;

@end

国际药物治疗产品代码:

代码语言:javascript
复制
@interface IDTherapyProducts : NSObject 

//Array contains 'String' objects
@property (nonatomic, strong)NSMutableArray* contents;
@property (nonatomic, copy)NSString* uniqueId;
@property (nonatomic, copy)NSString* timestamp;
@property (nonatomic, copy)NSString* price;
@property (nonatomic, copy)NSString* posted;
@property (nonatomic, copy)NSString* normalPrice;
@property (nonatomic, copy)NSString* metadata;
@property (nonatomic, copy)NSString* lang;
@property (nonatomic, copy)NSString* objId;
@property (nonatomic, copy)NSString* badge;

//methods
-(id)initWithJsonDic:(NSDictionary*)jsonDic;

@end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-25 10:58:13

这是将属性与KVC混淆的简单情况。它们是不同的东西。

content.metadata不过是[content metadata]的语法糖。因此,您需要在content上使用一个名为-metadata的方法,并且由于content是一个NSDictionary,所以不存在该方法。这就是抛出异常的原因。

在任何普通对象上,[content valueForKey: @"metadata"]也会抛出异常,因为KVC查找具有该名称的方法。但是,在NSDictionary上,-valueForKey:被重写为调用-objectForKey:,除非键以@开头,在这种情况下,@被剥离,[super valueForKey: ...]被调用。

然而,我希望能够使用点符号。

然后在NSDictionary上需要一个名为-metadata的方法。你可以用一个分类。

代码语言:javascript
复制
@interface NSDictionary(MyMetadataExtension)

-(id) metadata;

@end

@implementation NSDictionary(MyMetadataExtension)

-(id) metadata
{
    return [self objectForKey: @"metadata"];
}
@end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19002827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档