2013-05-15 78 views
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,我将它存储在string中,将它发送到Objective-C,然后重新创建字典(上面的代码)。EXC_BAD_ACCESS填写字典(?)

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

编辑: 从统一样本:

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

你用NSMutableDictionnary代替传统的NSDictionnary吗? – Kirualex

+0

@Kirualex它不是“传统的”,它是不可变的。在初始化之后,不能修改NSDictionary的内容。应该使用NSMutableDictionary而不是 –

+0

检查keyValue数组是否总是包含2个对象。 B'coz你正在使用objectAtIndex:1和objectAtIndex:0。所以,不确定它是否包含2个对象。检查一个条件。 –

回答

2

您所犯的错误是您正在尝试修改NSDictionary的不可变版本。

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

这是关于NSMutableDictionary的文档。 这里是an example如何创建符合NSMutableCopying协议的不可变对象的可变版本。

2

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

此外,您应该使用setObject:forKey:,因为setValue:forKey:是KVC方法。对于大多数密钥,它恰好在NSMutableDictionary上做同样的事情,但它稍微慢一些。

最后,你应该检查编辑[keyValue count] >= 2试图在索引0访问对象之前和1

此外,CreateNSString()看起来很可疑。它可能是泄漏或过早释放字符串。但是你需要发布代码。在任何情况下,我都会使用

seg = [NSString stringWithUTF8String: segment]; 

或者其他适当的方法,如果段没有用UTF-8编码。

+0

'CreateNSString()'来自Unity示例,将编辑中的代码发布到我的问题中。 – NPS