解决ARC的循环引用问题

看看下面的程序有什么问题:

BNRItem.h

@interface BNRItem : NSObject

@property (nonatomic, strong) BNRItem *containedItem;
@property (nonatomic, strong) BNRItem *container;

...

@end

 

BNRItem.m

#import "BNRItem.h"

@implementation BNRItem

...

- (void)setContainedItem:(BNRItem *)containedItem
{
    _containedItem = containedItem;
    self.containedItem.container = self;
}

@end

main.m

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        // Create a mutable array object, store its address in items variable
        NSMutableArray *items = [[NSMutableArray alloc] init];

        BNRItem *backpack = [[BNRItem alloc] initWithItemName:@"Backpack"];
        [items addObject:backpack];

        BNRItem *calculator = [[BNRItem alloc] initWithItemName:@"Calculator"];
        [items addObject:calculator];

        backpack.containedItem = calculator;

        backpack = nil;
        calculator = nil;

        for (BNRItem *item in items) {
            NSLog(@"%@", item);
        }

        // Destroy the mutable array object
        NSLog(@"Setting items to nil...");
        items = nil;

    }
    return 0;
}

 

上面的程序是有问题的,会导致循环引用(strong reference cycle)。

导致内存泄露。

 

解决方案:

将某个指针的特性设置为弱引用

@property (nonatomic, weak) BNRItem *container;

 

时间: 2024-09-18 19:29:19

解决ARC的循环引用问题的相关文章

ARC下的block导致的循环引用问题解析

ARC下的block导致的循环引用问题解析 更详细细节请参考 http://blog.sina.com.cn/s/blog_8c87ba3b0101m599.html   ARC下,copy到堆上的block,会强引用进入到该block中的外部变量.这很容易导致循环引用的问题. 比方说: 一个VC(这里指一个controller)中有一个属性为model.VC强引用了它. VC --> model 这个model呢,里面有一个copy属性的block,该block赋值如下如下.model.dem

block使用小结、在arc中使用block、如何防止循环引用(zz)

标签:  __block   __weak   arc   self   cfgetretaincount 分类: iOS zz from http://www.cnbluebox.com/?p=255 引言 使用block已经有一段时间了,感觉自己了解的还行,但是几天前看到CocoaChina上一个关于block的小测试主题: [小测试]你真的知道blocks在Objective-C中是怎么工作的吗?,发现竟然做错了几道, 才知道自己想当然的理解是错误的,所以抽时间学习了下,并且通过一些测试代

iOS - NSTimer循环引用的解决办法

发生场景 在 Controller B 中有一个 NSTimer @property (strong, nonatomic) NSTimer *timer;  你创建了它,并挂载到 main runloop self.timer = [NSTimer scheduledTimerWithTimeInterval:1   target:self selector:@selector(timerAction:) userInfo:nil repeats:true];  然后退出 Controller

解决循环引用的一个例子

最近在讨论设计时注意到一个循环引用的问题.它是在使用引用计数指针时发生的.如下图所示: ClassA和ClassB分属两个不同的线程,ClassB通常由ClassA发起请求创建,并由ClassA使用,ClassB则会在必要时通知ClassA一些事件.两者中各保留了对方的一个引用计数指针RefPtr. 如果在析构时释放成员变量的话,就会发生循环引用的问题,导致两个对象释放失败.   最直接的解决方法(不考虑弱引用指针)就是将释放指针的操作显示定义成函数,与析构函数分离开来,并在析构前确保调用这个函

block循环引用解决

block循环引用解决 实验代码 @interface ViewController ()@property (nonatomic, strong) TestNetworkBlock *testNetwork;@end @implementation ViewController (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a

Unity Application Block 1.0系列(6):杜绝循环引用

在介绍 Constructor Injection.Property Injection和 Method Call Injection时,都有特别提到不要出现循环引用(Circular References),因为出现这种问题后很难去检测到.最好的解决方法是写代码时候尽量避免出现这种情况. 下面看看循环引用的几个场景,在使用依赖注入框架时应该尽量避免出现这样的情况: 1.通过Constructor Injection生成的对象在构造器的参数中互相引用 public class Class1{ p

Excel总是弹出循环引用警告怎么办?

  很多人在打开Excel的时候会频繁弹出"循环引用警告"这是怎么回事?是什么原因造成的?如何阻止弹出呢?请看下面的解决办法. Excel总是弹出循环引用警告怎么办?如何解决 原因:公式引用的对象,直接或间接地引用了当前单元格本身.所以给出错误提醒. 循环引用是指在excel公式中自已直接或间接的引用自已,如下面的公式 C10 =SUM(C6:C10) 'c10中设置的求和公共包括它本身 当表格中含有循环引用时,每次打开表格都会出现提示,如下图所示. 如何能快速找到循环引用的公式地址呢

Samples DataBind FastJson循环引用问题

  Fastjson full support databind, it's simple to use. Encode import com.alibaba.fastjson.JSON; Group group = new Group(); group.setId(0L); group.setName("admin"); User guestUser = new User(); guestUser.setId(2L); guestUser.setName("guest&qu

iOS闭包循环引用精讲

前言 本篇文章精讲iOS开发中使用Block时一定要注意内存管理问题,很容易造成循环引用.本篇文章的目标是帮助大家快速掌握使用block的技巧. 我相信大家都觉得使用block给开发带来了多大的便利,但是有很多开发者对block内存管理掌握得不够好,导致经常出现循环引用的问题.对于新手来说,出现循环引用时,是很难去查找的,因此通过Leaks不一定能检测出来,更重要的还是要靠自己的分析来推断出来. 声景一:Controller之间block传值 现在,我们声明两个控制器类,一个叫ViewContr