在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
相关产品推荐
相关产品推荐

