Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.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
ARC不';t在Objective-C+中工作+; 我得到了一个C++函数,它得到了 STD::MAP< /Cord>对象,并将其转换为 CFubabLeDeCydiyRef>代码>,以便在方法>代码> CFNoTimeCycTestPoeNebug < /Cuff>上使用它。以下是我的实现: 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); } void IPCNotificationSender::send(常量字符*标识符,映射dict) { NSMutableDictionary*myDict=[NSMutableDictionary]; CFStringRef cfIdentifier=CFStringCreateWithCString(空,标识符, kCFStringEncodingMacRoman); for(std::map::iterator it=dict.begin();it!=dict.end();++it) { NSString*键=[NSString stringWithUTF8String:it->first]; NSString*val=[nsstringwithutf8string:it->second]; myDict[key]=key; } CFMutableDictionaryRef myCFDict=(CFMutableDictionaryRef)cfbrigingRetain(myDict); CFNotificationCenterPostNotification(CFNotificationCenterGetDistributedCenter(),cfIdentifier,NULL,myCFDict,TRUE); CFRelease(myCFDict); CFRelease(cfIdentifier); }_C++_Objective C_Macos_Memory Leaks_Nsobject - Fatal编程技术网

ARC不';t在Objective-C+中工作+; 我得到了一个C++函数,它得到了 STD::MAP< /Cord>对象,并将其转换为 CFubabLeDeCydiyRef>代码>,以便在方法>代码> CFNoTimeCycTestPoeNebug < /Cuff>上使用它。以下是我的实现: 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); } void IPCNotificationSender::send(常量字符*标识符,映射dict) { NSMutableDictionary*myDict=[NSMutableDictionary]; CFStringRef cfIdentifier=CFStringCreateWithCString(空,标识符, kCFStringEncodingMacRoman); for(std::map::iterator it=dict.begin();it!=dict.end();++it) { NSString*键=[NSString stringWithUTF8String:it->first]; NSString*val=[nsstringwithutf8string:it->second]; myDict[key]=key; } CFMutableDictionaryRef myCFDict=(CFMutableDictionaryRef)cfbrigingRetain(myDict); CFNotificationCenterPostNotification(CFNotificationCenterGetDistributedCenter(),cfIdentifier,NULL,myCFDict,TRUE); CFRelease(myCFDict); CFRelease(cfIdentifier); }

ARC不';t在Objective-C+中工作+; 我得到了一个C++函数,它得到了 STD::MAP< /Cord>对象,并将其转换为 CFubabLeDeCydiyRef>代码>,以便在方法>代码> CFNoTimeCycTestPoeNebug < /Cuff>上使用它。以下是我的实现: 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); } void IPCNotificationSender::send(常量字符*标识符,映射dict) { NSMutableDictionary*myDict=[NSMutableDictionary]; CFStringRef cfIdentifier=CFStringCreateWithCString(空,标识符, kCFStringEncodingMacRoman); for(std::map::iterator it=dict.begin();it!=dict.end();++it) { NSString*键=[NSString stringWithUTF8String:it->first]; NSString*val=[nsstringwithutf8string:it->second]; myDict[key]=key; } CFMutableDictionaryRef myCFDict=(CFMutableDictionaryRef)cfbrigingRetain(myDict); CFNotificationCenterPostNotification(CFNotificationCenterGetDistributedCenter(),cfIdentifier,NULL,myCFDict,TRUE); CFRelease(myCFDict); CFRelease(cfIdentifier); },c++,objective-c,macos,memory-leaks,nsobject,C++,Objective C,Macos,Memory Leaks,Nsobject,但是,NSString*键对象中似乎存在内存泄漏,应该在该对象中自动释放。我尝试在objective-C函数类型上实现转换,但仍然得到相同的结果。。。我倾向于相信C++和ObjuleC之间的混合,虽然有效,但是会导致Objut-C垃圾回收器的一些问题。p> 我的实现哪里出了问题 感谢我遇到了同样的问题,在共享c++/objective c项目中,内存管理似乎存在问题 解决方案是创建可以手动释放的对象 在代码中,请尝试以下操作: for (std::map<const char *, co

但是,
NSString*键
对象中似乎存在内存泄漏,应该在该对象中自动释放。我尝试在objective-C函数类型上实现转换,但仍然得到相同的结果。。。我倾向于相信C++和ObjuleC之间的混合,虽然有效,但是会导致Objut-C垃圾回收器的一些问题。p> 我的实现哪里出了问题


感谢

我遇到了同样的问题,在共享c++/objective c项目中,内存管理似乎存在问题

解决方案是创建可以手动释放的对象

在代码中,请尝试以下操作:

 for (std::map<const char *, const char *>::iterator it=dict.begin(); it!=dict.end(); ++it)
{
    CFStringRef key = CFStringCreateWithCString(NULL, it->first,
                                                         kCFStringEncodingMacRoman);
    CFStringRef val = CFStringCreateWithCString(NULL, it->second,
                                                kCFStringEncodingMacRoman);

    myDict[(__bridge NSString *  _Nonnull __strong)(key)] = (__bridge NSString *  _Nonnull __strong)(val);

    CFRelease(key);
    CFRelease(val);
}
for(std::map::iterator it=dict.begin();it!=dict.end();++it)
{
CFStringRef key=CFStringCreateWithCString(NULL,它->第一个,
kCFStringEncodingMacRoman);
CFStringRef val=CFStringCreateWithCString(空,它->秒,
kCFStringEncodingMacRoman);
myDict[((桥接NSString*\u Nonnull\u strong)(键)]=((桥接NSString*\u Nonnull\u strong)(val);
CFRelease(键);
cfl释放(val);
}

我也遇到了同样的问题,共享c++/objective c项目中的内存管理似乎存在问题

解决方案是创建可以手动释放的对象

在代码中,请尝试以下操作:

 for (std::map<const char *, const char *>::iterator it=dict.begin(); it!=dict.end(); ++it)
{
    CFStringRef key = CFStringCreateWithCString(NULL, it->first,
                                                         kCFStringEncodingMacRoman);
    CFStringRef val = CFStringCreateWithCString(NULL, it->second,
                                                kCFStringEncodingMacRoman);

    myDict[(__bridge NSString *  _Nonnull __strong)(key)] = (__bridge NSString *  _Nonnull __strong)(val);

    CFRelease(key);
    CFRelease(val);
}
for(std::map::iterator it=dict.begin();it!=dict.end();++it)
{
CFStringRef key=CFStringCreateWithCString(NULL,它->第一个,
kCFStringEncodingMacRoman);
CFStringRef val=CFStringCreateWithCString(空,它->秒,
kCFStringEncodingMacRoman);
myDict[((桥接NSString*\u Nonnull\u strong)(键)]=((桥接NSString*\u Nonnull\u strong)(val);
CFRelease(键);
cfl释放(val);
}
C++问题:
  • 这张地图看起来很糟糕。它应该是
    map
  • 您是按值传递映射,而不是按常量传递映射
目标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);
    }
}
NSString*ConvertToObjC(常量字符串&s)
{
返回[nsstringwithutf8string:s.c_str()];
}
NSDictionary*ConvertToObjC(常量映射和cppMap)
//这里我使用的模板有很多魔力,但这是离题的,
{
NSMutableDictionary*结果=[NSMutableDictionary dictionaryWithCapacity:cppMap.count()];
用于(常数自动&x:cppMap)
{
结果[ConvertToObjC(x.first)]=ConvertToObjC(x.second);
}
返回结果;
}
void IPNotificationSender::send(常量字符串和标识符,
常量映射和cppMap)
{
@自动释放池{
自动识别=转换到BJC(标识符);
自动myDic=转换到BJC(cppMap);
CFNotificationCenterPostNotification(
CFNotificationCenterGetDistributedCenter(),
(CFStringRef)CfBrigingRetain(标识),
无效的
(CFDictionaryRef)CfBrigingRetain(myDict),
正确的);
}
}
C++问题:
  • 这张地图看起来很糟糕。它应该是
    map
  • 您是按值传递映射,而不是按常量传递映射
目标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);
    }
}
NSString*ConvertToObjC(常量字符串&s)
{
返回[nsstringwithutf8string:s.c_str()];
}
NSDictionary*ConvertToObjC(常量映射和cppMap)
//这里我使用的模板有很多魔力,但这是离题的,
{
NSMutableDictionary*结果=[NSMutableDictionary dictionaryWithCapacity:cppMap.count()];
用于(常数自动&x:cppMap)
{
结果[ConvertToObjC(x.first)]=ConvertToObjC(x.second);
}
返回结果;
}
void IPNotificationSender::send(常量字符串和标识符,
常量映射和cppMap)
{
@自动释放池{
自动识别=转换到BJC(标识符);
自动myDic=转换到BJC(cppMap);
CFNotificationCenterPostNotification(
CFNotificationCenterGetDistributedCenter(),
(CFStringRef)CfBrigingRetain(标识),
无效的
(cfyref)CFBri