You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C++类中添加Objective-C @property的正确语法是什么?(iOS广告场景)

解决方案

因为C语法不支持Objective-C的@property特性,我们需要通过**Objective-C(.mm文件)**实现跨语言混合编程,将Yandex Mobile Ads的Objective-C对象封装在C++子类内部,以此替代@property的功能。

1. 子类头文件(YandexIosInterstitialAd.hpp)

#include "InterstitialAd.h"
// 导入Yandex Mobile Ads的Objective-C头文件
#import <YandexMobileAds/YandexMobileAds.h>

class YandexIosInterstitialAd : public InterstitialAd
{
public:
    // 重写基类纯虚函数
    void initialize(std::string unit_id) override;
    void load() override;
    void show() override;
    void uninitialize() override;

private:
    // 用Objective-C类型的私有成员变量替代@property,直接管理Yandex广告对象
    YMAInterstitialAd* _interstitialAd = nullptr;
    YMAInterstitialAdLoader* _adLoader = nullptr;
};

2. 子类实现文件(YandexIosInterstitialAd.mm)

注意:实现文件必须使用.mm后缀,让编译器按照Objective-C++规则编译。

#include "YandexIosInterstitialAd.hpp"

void YandexIosInterstitialAd::initialize(std::string unit_id)
{
    // 将C++字符串转换为Objective-C字符串
    NSString* iosUnitId = [NSString stringWithUTF8String:unit_id.c_str()];
    
    // 初始化Yandex广告加载器,符合官方初始化要求
    _adLoader = [[YMAInterstitialAdLoader alloc] initWithAdUnitID:iosUnitId];
    
    // 处理广告加载的代理回调(用block简化实现,避免额外定义Obj-C类)
    __weak typeof(this) weakSelf = this;
    _adLoader.delegate = [[NSObject<YMAInterstitialAdLoaderDelegate> alloc] initWithSuccessBlock:^(YMAInterstitialAd *ad) {
        weakSelf->_interstitialAd = ad;
        // 可添加广告加载成功后的自定义逻辑
    } failureBlock:^(NSError *error) {
        // 处理广告加载失败逻辑
    }];
}

void YandexIosInterstitialAd::load()
{
    if (_adLoader) {
        [_adLoader loadAd];
    }
}

void YandexIosInterstitialAd::show()
{
    if (_interstitialAd) {
        // 获取当前显示的ViewController(实际项目中可根据场景调整获取方式)
        UIViewController* currentVC = [UIApplication sharedApplication].keyWindow.rootViewController;
        [_interstitialAd presentFromViewController:currentVC];
    }
}

void YandexIosInterstitialAd::uninitialize()
{
    // 释放Yandex广告对象,避免内存泄漏
    _interstitialAd = nil;
    _adLoader = nil;
}

核心要点说明

  • Objective-C++混合编程:通过.mm文件实现C与Objective-C代码交互,既遵守C基类的接口规范,又能调用Yandex Mobile Ads的Objective-C API。
  • 成员变量替代@property:C++类内部直接声明Objective-C类型的私有成员,手动管理对象的创建与释放,等效于Objective-C中@property的底层逻辑。
  • 代理回调处理:利用block形式的代理实现,避免定义额外的Objective-C类来实现协议;若需复杂回调逻辑,也可单独定义Objective-C辅助类处理代理,再通知C++子类。

内容的提问来源于stack exchange,提问作者Alexey Starinsky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 23:50:16