在Objective-c中的NSDictionary中用"Struct"创建一个Map?

Pra*_*ar 1 objective-c

我想用一个Integer Mapping创建一个NSMutableDictionary到一个strucuter(struct).例:

int nVar = 1;
typedef struct 
{
  NSString *pstrName;
}sSampleStruct;
sSampleStruct *sObject = {@"test"};
NSMutableDictioary *pSampleMap = [[NSMutableDictioary allo] init];
[pSampleMap setObject:sObject forKey:[[nsnumber alloc] initwithint:nVar];
Run Code Online (Sandbox Code Playgroud)

这是我想做的事情?但由于结构不是一个对象,它会发出警告吗?无论如何,我可以用strutures创建一个字典.或者以任何其他方式创建具有结构的地图?

请尽快回复.....

谢谢普拉迪普.

Joo*_*ost 12

看看NSValue:

[pSampleMap setObject:[NSValue value:&sObject withObjCType:@encode(sSampleStruct)] forKey:[NSNumber numberWithInt:nInt]];
Run Code Online (Sandbox Code Playgroud)

此外,[[NSNumber alloc] initWithInt:nVar]由于Objective-C区分大小写,因此您的内存泄漏并且您的代码甚至无法编译.


Jar*_*die 8

你是对的,因为NSDictionary中的键和值都必须是对象.你在寻找什么NSValue.

来自文档:

NSValue对象是单个C或Objective-C数据项的简单容器.它可以包含任何标量类型,如int,float和char,以及指针,结构和对象id.此类的目的是允许将此类数据类型的项添加到集合中,例如NSArray和NSSet的实例,这些集合要求其元素为对象.NSValue对象始终是不可变的.

类似的东西(稍微清理代码):

typedef struct 
{
    NSString *pstrName;
} sSampleStruct;

// Changed sObject to non-pointer so it can be initialized with a literal
sSampleStruct sObject = {@"test"};

// Corrected spelling of NSMutableDictionary
NSMutableDictionary *pSampleMap = [[NSMutableDictionary alloc] init];

// Changed to [NSNumber numberWithInt:] to avoid leaking memory
// Corrected spelling and capitalization of NSNumber
[pSampleMap setObject:[NSValue valueWithPointer:&sObject] 
               forKey:[NSNumber numberWithInt:nVar]];
Run Code Online (Sandbox Code Playgroud)