【发布时间】:2019-03-20 09:56:27
【问题描述】:
我正在开发 C++ 和 Objective-C++ 应用程序。我有 C++ 类,它调用 Objective-c++ 类。在 c++ 标头中,我正在创建 void*,如下所示:
void *m_self;
然后在构造函数中我像这样实例化objective-c++:
m_self = [[InfoForMac alloc] init];
在析构函数中我这样做:
[(__bridge id)m_self release];
objective-c++类有这个接口:
@interface InfoForMac : NSObject
@property (nonatomic, copy) NSString* data1;
@property (nonatomic, copy) NSString* data2;
@property (nonatomic, assign) int val;
它的init方法:
- (id) init
{
if ( (self = [super init]) ) {
self.data1 = @"";
self.data2 = @"";
self.val = -1;
}
return self;
}
及其析构函数:
-(void)dealloc
{
[self.data1 release];
[self.data2 release];
[super dealloc];
}
我正在像这样从 C++ 调用 Objective-C++ 方法:
[(__bridge id)m_self getData1];
QString dataFromMac = QString::from NSString([(__bridge id)m_self data1]);
相关方法如下:
- (void) getData1
{
NSRunningApplication* activeApp = nil;
activeApp = [[NSWorkspace sharedWorkspace] frontmostApplication];
if (activeApp) {
NSString* activeAppLocalizedName = [activeApp localizedName];
CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
if (windowList) {
NSArray *windows = (__bridge NSArray*)(windowList);
for (NSDictionary *window in windows) {
NSString* owner = [window objectForKey:@"kCGWindowOwnerName"];
if (activeAppLocalizedName != nil &&
[owner isEqualToString:activeAppLocalizedName]) {
self.data1 = activeAppLocalizedName;
}
}
CFRelease(windowList);
}
}
}
C++ 类被销毁并重新创建。问题是,在我重新创建类并调用 getData1 方法时销毁类后,我在这里遇到了崩溃:
self.data1 = activeAppLocalizedName;
使用调试器堆栈跟踪检查显示该调用,然后显示 objc_msgSend。我已阅读,似乎崩溃可能是由于额外的释放或损坏。
有人可以帮我理解发生了什么吗?
提前致谢和问候
【问题讨论】:
-
我不相信您的问题出在您发布的代码中。您是否尝试过在启用 Zombie 对象诊断的情况下运行您的代码?我怀疑您在其他地方遇到了引用问题。我不太喜欢你的代码的一件事是
[self.data1 release];。这不一定总是错误的,但如果self.data1再次被[super dealloc]间接使用,它可能会导致问题。考虑改用self.data1 = nil;,这不会留下任何悬空引用。
标签: properties crash nsstring objective-c++ manual-retain-release