如何防止 C++/Objective-C 中的根对象被删除

问题描述 投票:0回答:1

我的 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 是强引用吗?如果不是怎么变强?

objective-c
1个回答
1
投票

问题可能源于 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 实例本身仍然有效,因为它的过早销毁可能会导致崩溃。

© www.soinside.com 2019 - 2024. All rights reserved.