Sian 发表于 2014-3-20 11:31:53

ARC如何解决循环相互引用的问题

本帖最后由 Sian 于 2014-3-28 23:29 编辑

1、在MRC中,相互引用问题是在其中一方的成员变量属性retain修改成assign,参考:http://www.yusian.com/forum.php?mod=viewthread&tid=948&fromuid=3
2、在ARC中,同样的原理,将其中一方成员变量属性中的strong修改成weak;
3、图示说明一下,首先创建两个对象




4、两个对象中各有一成员变量相互指向对方,现将Person对象中的_dog设置为强引用,即_dog为强指针,Dog对象中的_person为弱指针:




5、当main函数结束时,Person * p与Dog * d会被释放:




6、由于Person对象只有一个弱指针(Dog对象中的_person)指向该对象,ARC机制将其释放:




7、Person对象被释放,对象成员变量_dog也随一起释放,此时剩下只有Dog对象,原本唯一指向Dog对象的_dog也不存在,Dog对象也被释放

参考代码:
Person.h
//
//Person.h
//ARC
//
//Created by yusian on 14-3-19.
//Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//

#import <Foundation/Foundation.h>

@class Dog;

@interface Person : NSObject

// Person对象中的成员变量_dog为强引用
@property (nonatomic, strong) Dog * dog;

@end
Person.m
//
//Person.m
//ARC
//
//Created by yusian on 14-3-19.
//Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//

#import "Person.h"
#import "Dog.h"

@implementation Person

- (void)dealloc
{
    // 标记,如果对象被释放即会输出这句
    NSLog(@"%@ is dealloc", self);
}

@end
Dog.h
//
//Dog.h
//ARC
//
//Created by yusian on 14-3-20.
//Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//

#import <Foundation/Foundation.h>

@class Person;

@interface Dog : NSObject

// Dog对象中的成员变量_person为弱引用
@property (nonatomic, weak) Person * person;

@end
Dog.m
//
//Dog.m
//ARC
//
//Created by yusian on 14-3-20.
//Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//

#import "Dog.h"
#import "Person.h"

@implementation Dog

- (void)dealloc
{
    // 标记,如果对象被释放即会输出这句
    NSLog(@"%@ is dealloc", self);
}

@end
main.m
//
//main.m
//ARC
//
//Created by yusian on 14-3-19.
//Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"

int main()
{
    NSLog(@"Start main...");
   
    // 创建Person对象p
    Person * p = [ init];
   
    // 创建Dog对象d
    Dog * d = [ init];
   
    // 将d赋值给p对象中的成员对象_dog;
    p.dog = d;
   
    // 将p赋值给d对象中的成员变量_person;
    d.person = p;
   
    NSLog(@"End main...");
    return 0;
}运行结果:2014-03-20 11:31:42.645 ARC Start main...2014-03-20 11:31:42.647 ARC End main...2014-03-20 11:31:42.647 ARC <Person: 0x100301d70> is dealloc2014-03-20 11:31:42.647 ARC <Dog: 0x1003062d0> is deallocProgram ended with exit code: 0
内存图示ppt下载:


页: [1]
查看完整版本: ARC如何解决循环相互引用的问题