本帖最后由 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 = [[Person alloc] init];
-
- // 创建Dog对象d
- Dog * d = [[Dog alloc] 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[1088:303] Start main... 2014-03-20 11:31:42.647 ARC[1088:303] End main... 2014-03-20 11:31:42.647 ARC[1088:303] <Person: 0x100301d70> is dealloc 2014-03-20 11:31:42.647 ARC[1088:303] <Dog: 0x1003062d0> is dealloc Program ended with exit code: 0
内存图示ppt下载:
ARC.pptx.zip
(53.24 KB, 下载次数: 0)
|