基于c++智能指针的类OC delegate

基于c++智能指针的类OC delegate,第1张

有了一段时间的iOS开发经历,感觉OC中MVC那一套结构确实挺不错,用起来很方便,现在自己要用C++做点东西,需要用到循环的代理,就想用OC中很常用的那个delegate模式,结果发现C++里面还真不太一样😂。

OC中这个delegate很简单,如下图:

主要场景就是,A类对象中(以下简称a)中有一个成员是B类对象(以下简称b),在a使用b的过程中,b需要给a中提交一些数据,在OC中,提交数据的方法,是由delegate这个类来定义,由A来实现,然后在B中有一个以weak持有的delegate对象,所以直接将a赋值给b中的delegate就可以。

OC中的weak引用原理和c++的weak_ptr类似,不会增加对象的引用计数,所以在释放空间时,不会因为循环引用而产生内存泄漏。

当我试图用C++来实现的时候,就遇到了一点小困难,首先C++11中新增的weak_ptr必须和shared_ptr绑定使用,也只能通过shared_ptr来构造(默认构造不考虑)。所以我在a中初始化完成之后,并不能直接获取一个shared_ptr来赋值给b中的delegate,如下代码:

void A::init() {
    m_b = std::shared_ptr();
    std::shared_ptr pt = std::make_shared(this);
    b->setDelegate(pt);
}

这是我最初尝试的方法,结果在函数结束的时候,就crash了,原因是当前虽然通过当前this创建了一个shared_ptr,但是这个shared_ptr并没有真正管理这个this,所以在函数结束,pt被销毁时就出现了错误。

        根据目前C++的逻辑,想要直接通过OC那样直接复制的方式是不行的,所以,相对来说,我才用了一个曲线救国的办法,那就是绕一个小圈子,上面的crash的主要原因就是shared_ptr是中途根据this来创建的,所以最好是从创建a对象的时候,就使用shared_ptr,然后以这个shared_ptr去设置b中的delegate,就可以了,主要代码如下:

// mian.cpp
std::shared_ptr a = std::make_shared();
...
a->setDelegateForB(a);

...

// A.cpp
void A::setDelegateForB(std::shared_ptr delegate) {
    m_b->setDelegate(delegate);
}

// B.hpp
...
private:
    std::weak_ptr m_Delegate;

// B.cpp
void B::setDelegate(std::shared_ptr delegate) {
    m_Delegate = delegate;
}

主要的设置过程就是这样了,多加了一个设置的方法,就是从结构上来说,比较简单,而且在释放空间的时候,b中的weak_ptr避免了循环引用的内存泄漏。 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/993390.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存