我的 C++/Objective-C 应用程序中有以下代码:
#import <YandexMobileAds/YandexMobileAds-Swift.h>
@class AdHook;
namespace MyApp
{
class AdHolder
{
public:
AdHolder(IosInterstitialAd* cpp_ad);
AdHook* m_hook;
};
}
using namespace MyApp;
@interface AdHook : NSObject <YMAInterstitialAdLoaderDelegate, YMAInterstitialAdDelegate>
{
@public IosInterstitialAd* m_cppAd;
@public YMAInterstitialAdLoader* m_loader;
@public YMAInterstitialAd* m_interstitialAd;
}
@end
@implementation AdHook
- (id)initFromCpp:(IosInterstitialAd *)cpp_ad
{
if (self = [super init])
{
m_cppAd = cpp_ad;
m_interstitialAd = nil;
m_loader = [[YMAInterstitialAdLoader alloc]init];
m_loader.delegate = self;
}
return self;
}
AdHolder::AdHolder(IosInterstitialAd* cpp_ad)
{
[YMAMobileAds enableLogging];
m_hook = [[AdHook alloc]initFromCpp:cpp_ad];
}
void SomeOtherClass::load()
{
NSLog(@"IosInterstitialAd::load()");
YMAAdRequestConfiguration* configuration = [[YMAAdRequestConfiguration alloc]initWithAdUnitID:@"demo-interstitial-yandex"];
[m_holder->m_hook->m_loader loadAdWithRequestConfiguration:configuration];
}
我在 C++ 代码中创建了
AdHolder
类的实例,而 AdHolder
的构造函数创建了 Objective-C 类 AdHook
的实例,而后者又创建了其内部 Objective-C 对象。
但是我不太明白
m_hook
的生命周期是什么?我怀疑它在某个时候被删除,因为当我尝试从 m_hook->m_interstitialAd
回调访问 YMAInterstitialAdLoaderDelegate
时,我得到了错误的值并且应用程序崩溃了。
m_hook 是强引用吗?如果不是怎么变强?
问题可能源于 m_hook 不是您的 C++ 类中的强引用。在 Objective-C/C++ 互操作中,普通指针并不意味着所有权。要创建强引用,请修改 AdHolder 类以使用指向指针的指针 (AdHook** m_hook;)。在构造函数中,用 m_hook = new AdHook*; 分配它*m_hook = [[AdHook alloc] initFromCpp:cpp_ad];。添加析构函数来清理: if (m_hook) { [*m_hook release];删除m_hook; }。访问时使用(*holder()->m_hook)->m_loader。这可确保 AdHook 对象不会意外释放。另外,当您访问 m_hook 时,请验证 AdHolder 实例本身仍然有效,因为它的过早销毁可能会导致崩溃。