避免循环引用

比较常见的避免循环引用的方法

- (void)viewDidLoad {

    [super viewDidLoad];

    __weak typeof(self) weakSelf = self;

    self.block = ^ {

[weakSelf requestDataList];  

    }

}

我们再看一段代码

- (void)viewDidLoad {

    [super viewDidLoad];

    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];

    NSOperationQueue *mainQuene = [NSOperationQueue mainQueue];

    [center addObserverForName:UIKeyboardWillShowNotification

                        object:nil

                         queue:mainQuene

                    usingBlock:^(NSNotification *note) {

                             [self requestDataList];

                    }];

}

当返回到上一级页面的时候 dealloc 方法没有走,为什么

首先:usingBlock中请求加载数据,block retain self对象,这里没有形成循环引用,但依然造成内存泄漏

原因:center类使用单例设计,走完这个viewDidLoad方法也不会释放,而它指向的block保留了self ,导致 self 引用计数总是不为0

解决办法:将block中的self弱引用

在 QML 中,避免循环引用的一种常见方法是使用 weak 指针。weak 指针不会增加引用计数,也不会阻止对象的析构。因此,当一个对象需要引用另一个对象,但不需要拥有该对象时,可以使用 weak 指针。 下面是一个使用 weak 指针避免循环引用的例子: ``` import QtQuick 2.0 Item { property Item otherItem: null function doSomething() { if (otherItem !== null) { var otherItemRef = otherItem // 强制转换为弱引用 otherItemRef.doSomethingElse() } } } ``` 在这个例子中,我们使用了一个名为 `otherItem` 的 `Item` 对象作为属性。当 `doSomething` 函数被调用时,我们使用 `otherItem` 属性来调用另一个对象的函数。注意到我们将 `otherItem` 强制转换为一个弱引用,这意味着即使 `otherItem` 被释放了,我们也不会持有它的引用。 此外,Qt Quick Controls 2.0 提供了一个对象释放机制,可以在对象不再需要时自动释放它。下面是一个使用对象释放机制避免循环引用的例子: ``` import QtQuick 2.0 import QtQuick.Controls 2.0 Item { property Item otherItem: null function doSomething() { if (otherItem !== null) { otherItem.doSomethingElse() } } Object { target: otherItem; onTargetDestroyed: otherItem = null } } ``` 在这个例子中,我们使用了一个名为 `otherItem` 的 `Item` 对象作为属性。当 `doSomething` 函数被调用时,我们使用 `otherItem` 属性来调用另一个对象的函数。同时,我们使用 `Object` 组件来监听 `otherItem` 对象的销毁事件,在 `otherItem` 被销毁时将它的引用设置为 `null`。 总之,避免循环引用是在 QML 中编写高质量代码的重要因素之一。使用 weak 指针或者对象释放机制可以帮助我们避免循环引用导致的内存泄漏问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值