gpt4 book ai didi

c++ - ARC 在 Objective-C++ 中不起作用

转载 作者:行者123 更新时间:2023-11-28 01:42:57 24 4
gpt4 key购买 nike

我有一个获取 std::map 的 C++ 函数对象并将其转换为 CFMutableDisctionryRef为了在方法上使用它 CFNotificationCenterPostNotification .这是我的实现:

void IPCNotificationSender::send(const char *identifier, map<const char *, const char *> dict)
{
NSMutableDictionary *myDict = [NSMutableDictionary dictionary];

CFStringRef cfIdentifier = CFStringCreateWithCString(NULL, identifier,
kCFStringEncodingMacRoman);
for (std::map<const char *, const char *>::iterator it=dict.begin(); it!=dict.end(); ++it)
{
NSString *key = [NSString stringWithUTF8String:it->first];
NSString *val = [NSString stringWithUTF8String:it->second];
myDict[key] = key;
}
CFMutableDictionaryRef myCFDict = (CFMutableDictionaryRef)CFBridgingRetain(myDict);

CFNotificationCenterPostNotification(CFNotificationCenterGetDistributedCenter(), cfIdentifier, NULL, myCFDict, TRUE);

CFRelease(myCFDict);
CFRelease(cfIdentifier);
}

但是,NSString *key 中似乎存在内存泄漏应该自动释放的对象。我尝试在 objective-C 函数类型之上实现转换,但仍然得到相同的结果......我倾向于认为 c++ 和 objective-C 之间的混合虽然有效,但会导致 objective-c 垃圾的一些问题集电极。

我的实现哪里出了问题?

谢谢

最佳答案

C++ 问题:

  • 这张 map 看起来很糟糕。应该是map<string, string>
  • 你是按值传递 map 而不是按 const rerence

Objective-C 问题:

根据给出公认答案的线索,我怀疑实际问题是什么。您的 C++ 代码会连续运行而不会到达自动释放池。因此,当您使用涉及自动释放池的 Objective C API 时,此对象不会被释放,因为自动释放池永远无法控制。

所以我会这样写:

NSString *ConvertToObjC(const string& s)
{
return [NSString stringWithUTF8String: s.c_str()];
}

NSDictionary *ConvertToObjC(const map<string, string>& cppMap)
// here I use templates which do lots of magic, but this is off topic,
{
NSMutableDictionary *result = [NSMutableDictionary dictionaryWithCapacity: cppMap.count()];

for (const auto& x : cppMap)
{
result[ConvertToObjC(x.first)] = ConvertToObjC(x.second);
}

return result;
}

void IPCNotificationSender::send(const string& identifier,
const map<string, string>& cppMap)
{
@autoreleasepool {
auto ident = ConvertToObjC(identifier);
auto myDic = ConvertToObjC(cppMap);

CFNotificationCenterPostNotification(
CFNotificationCenterGetDistributedCenter(),
(CFStringRef)CFBridgingRetain(ident),
NULL,
(CFDictionaryRef)CFBridgingRetain(myDict),
TRUE);
}
}

关于c++ - ARC 在 Objective-C++ 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46443706/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com