1、ARC = (Automatic Reference Counting) 即自动引用计数;
2、ARC的原则:只要没有强指针指向对象即刻释放;
3、ARC是编译器特性,编译器替代人工自动添加相关代码,与内存回收机制不同,后者是运行时机制;
4、弱指针创建的对象没有意义,创建出来后即被释放,默认指针都为强指针;
5、函数结束(代码块结束)后变量都会被回收,此时变量所指向的对象如果没有其他强指针指针,对象会回收,注意此时对象被释放并非函数本身将其释放,而是因为没有强指针指向而被释放;
参考代码:
Person.h- //
- // Person.h
- // ARC
- //
- // Created by yusian on 14-3-19.
- // Copyright (c) 2014年 小龙虾论坛. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- @interface Person : NSObject
- @end
复制代码 Person.m- //
- // Person.m
- // ARC
- //
- // Created by yusian on 14-3-19.
- // Copyright (c) 2014年 小龙虾论坛. All rights reserved.
- //
- #import "Person.h"
- @implementation Person
- - (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"
- void test();
- int main()
- {
- NSLog(@"Start main...");
- test();
-
- NSLog(@"End main...");
- return 0;
- }
- void test()
- {
- NSLog(@"Test start...");
-
- // 弱指针创建的对象会被立即释放,只能强指针才能hold住对象;
- __weak Person * p = [[Person alloc] init];
-
- // 标记,方便区分对象何时释放
- NSLog(@"1------------------");
-
- // 默认的指针都是强指针,强指针对象在函数结束后被释放
- Person * p1 = [[Person alloc] init];
-
- NSLog(@"2------------------");
-
- {
- Person * p2 = [[Person alloc] init];
- }// 在代码块结束后p2即被释放,原因是代码块结束后指针变量p2会被回收,p2创建的对象无指针指向时会被立即回收;
-
- NSLog(@"3------------------");
-
- NSLog(@"Test end...");
- }
复制代码 运行结果:2014-03-20 10:47:12.744 ARC[872:303] Start main... 2014-03-20 10:47:12.746 ARC[872:303] Test start... 2014-03-20 10:47:12.746 ARC[872:303] <Person: 0x1002062e0> is dealloc 2014-03-20 10:47:12.747 ARC[872:303] 1------------------ 2014-03-20 10:47:12.747 ARC[872:303] 2------------------ 2014-03-20 10:47:12.747 ARC[872:303] <Person: 0x100400a60> is dealloc 2014-03-20 10:47:12.748 ARC[872:303] 3------------------ 2014-03-20 10:47:12.748 ARC[872:303] Test end... 2014-03-20 10:47:12.748 ARC[872:303] <Person: 0x1002062e0> is dealloc 2014-03-20 10:47:12.749 ARC[872:303] End main... Program ended with exit code: 0
|