Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c EXC_填写字典时访问错误(?)_Objective C_Plugins_Nsdictionary - Fatal编程技术网

Objective c EXC_填写字典时访问错误(?)

Objective c EXC_填写字典时访问错误(?),objective-c,plugins,nsdictionary,Objective C,Plugins,Nsdictionary,我在标题中加了“?”,因为我不完全确定问题是否出在上面的代码中,但这是我最好的猜测。我正在将Countly iOS plugin与Unity集成,Countly plugin的一个方法将NSDictionary*作为参数。由于我不知道如何将字典从C#发送到Objective-C,我将我的dict存储在字符串中,将其发送到Objective-C,然后重新创建字典(上面的代码) 但这可能根本不相关。我知道EXC\u BAD\u ACCESS通常与未绑定的资源或其他东西有关,所以也许你可以看到我做错了

我在标题中加了“?”,因为我不完全确定问题是否出在上面的代码中,但这是我最好的猜测。我正在将Countly iOS plugin与Unity集成,Countly plugin的一个方法将
NSDictionary*
作为参数。由于我不知道如何将字典从C#发送到Objective-C,我将我的dict存储在
字符串中,将其发送到Objective-C,然后重新创建字典(上面的代码)

但这可能根本不相关。我知道
EXC\u BAD\u ACCESS
通常与未绑定的资源或其他东西有关,所以也许你可以看到我做错了什么(我根本不知道Objective-C,只需编写插件所需的几行代码)

编辑: 从Unity示例:

void CountlyRecordEventSegmentationCountSum(const char * key, const char * segmentation, int count, double sum)
{
    NSString * seg = CreateNSString(segmentation);
    NSArray * entries = [seg componentsSeparatedByString:@"`"];
    NSDictionary * dict = [NSDictionary dictionary];
    for (id entry in entries)
    {
        NSArray * keyValue = [entry componentsSeparatedByString:@"|"];
        [dict setValue:[keyValue objectAtIndex:1] forKey:[keyValue objectAtIndex:0]];
    }
    [[Countly sharedInstance] recordEvent:CreateNSString(key) segmentation:dict count:count sum:sum];
}

您需要使用
NSMutableDictionary
,不能修改
NSDictionary

另外,您应该使用
setObject:forKey:
,因为
setValue:forKey:
是一种KVC方法。对于大多数键,它在
NSMutableDictionary
上执行相同的操作,但速度稍慢

最后,在尝试访问索引0和1处的对象之前,应该检查
[keyValue count]>=2

编辑此外,
CreateNSString()
看起来可疑。它可能正在泄漏或过早释放字符串。但是你需要发布代码。无论如何,我会用

// Converts C style string to NSString
NSString * CreateNSString (const char * string)
{
    if (string)
        return [NSString stringWithUTF8String: string];
    else
        return [NSString stringWithUTF8String: ""];
}

或者,如果段未在UTF-8中编码,则使用其他适当的方法。

您需要使用
NSMutableDictionary
,您不能修改
NSDictionary

另外,您应该使用
setObject:forKey:
,因为
setValue:forKey:
是一种KVC方法。对于大多数键,它在
NSMutableDictionary
上执行相同的操作,但速度稍慢

最后,在尝试访问索引0和1处的对象之前,应该检查
[keyValue count]>=2

编辑此外,
CreateNSString()
看起来可疑。它可能正在泄漏或过早释放字符串。但是你需要发布代码。无论如何,我会用

// Converts C style string to NSString
NSString * CreateNSString (const char * string)
{
    if (string)
        return [NSString stringWithUTF8String: string];
    else
        return [NSString stringWithUTF8String: ""];
}

或者,如果段未以UTF-8编码,则使用其他适当的方法。

您所犯的错误是您试图修改不可变版本的
NSDictionary

初始化后不能修改
NSDictionary
的内容。您应该改用
NSMutableDictionary

这是一个关于的文档。
下面是如何创建符合协议的不可变对象的可变版本。

您所犯的错误是您试图修改不可变版本的
NSDictionary

初始化后不能修改
NSDictionary
的内容。您应该改用
NSMutableDictionary

这是一个关于的文档。
下面是如何创建符合协议的不可变对象的可变版本。

您是否尝试使用NSMutableDictionnary而不是传统的NSDictionnary?@Kirualex它不是“传统的”,它是不可变的。初始化后无法修改NSDictionary的内容。应该使用NSMutableDictionary而不是检查keyValue数组是否始终包含2个对象。因为您正在使用objectAtIndex:1和objectAtIndex:0。所以,不确定它是否包含2个对象。检查一个条件。@art divin我是否可以使用
NSMutableDictionary*
作为一个函数的参数,该函数将
NSDictionary*
作为参数?您可以在通常使用NSDictionary的地方使用NSMutableDictionary。它是NSDictionary的一个子类。但它是可变的。也就是说,您的代码在向dictionary对象发送“setValue:”时会崩溃。但这不是(目前)你的问题,因为这会引发不同的异常。你是否尝试使用NSMutableDictionnary而不是传统的NSDictionnary?@Kirualex它不是“传统的”,它是不变的。初始化后无法修改NSDictionary的内容。应该使用NSMutableDictionary而不是检查keyValue数组是否始终包含2个对象。因为您正在使用objectAtIndex:1和objectAtIndex:0。所以,不确定它是否包含2个对象。检查一个条件。@art divin我是否可以使用
NSMutableDictionary*
作为一个函数的参数,该函数将
NSDictionary*
作为参数?您可以在通常使用NSDictionary的地方使用NSMutableDictionary。它是NSDictionary的一个子类。但它是可变的。也就是说,您的代码在向dictionary对象发送“setValue:”时会崩溃。但这还不是你的问题,因为这会引发另一个异常。
CreateNSString()
来自Unity示例,将编辑中的代码发布到我的问题。
CreateNSString()
来自Unity示例,将编辑中的代码发布到我的问题。