1
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];
}

我放 ”?” 在标题中,因为我不完全确定问题是否出在上面的代码中,但这是我最好的猜测。我正在将 Countly iOS 插件与 Unity 集成,并且 Countly 插件的方法之一NSDictionary *作为参数。因为我不知道如何将字典从 C# 发送到 Objective-C,所以我将我的 dict 存储在 a 中string,将其发送到 Objective-C,然后重新创建字典(上面的代码)。

但这可能甚至不相关。我知道EXC_BAD_ACCESS通常与未释放的资源或某事有关,所以也许您可以看到我做错了什么(我根本不了解Objective-C,只写了插件所需的几行)。

编辑:来自 Unity 示例:

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

2 回答 2

2

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

此外,您应该使用setObject:forKey:因为setValue:forKey:是一种 KVC 方法。它碰巧在NSMutableDictionary大多数键上做同样的事情,但速度稍慢。

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

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

 seg = [NSString stringWithUTF8String: segment];

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

于 2013-05-15T11:23:08.297 回答
2

您犯的错误是您正在尝试修改NSDictionary.

NSDictionary初始化后无法修改其内容。你应该NSMutableDictionary改用。

这是有关NSMutableDictionary的文档。这是一个如何创建符合NSMutableCopying协议的不可变对象的可变版本的示例。

于 2013-05-15T15:45:51.423 回答