IOS中内存管理那些事中内存管理那些事
Objective-C 和 Swift 语言的内存管理方式都是基于引用计数「Reference Counting」的,引用计数是一个简单而有效管理对象生命周期的方式。引用计数分为手动引用计数
「ARC: AutomaticReference Counting」和自动引用计数「MRC: Manual Reference Counting」,现在都是用 ARC 了,但是我们还是很有必要了解 MRC。
1. 引用计数的原理是什么?
当我们创建一个新对象时,他的引用计数为1;
当有一个新的指针指向这个对象时,他的引用计数就加1;
当对象关联的某个指针不再指向他时,他的引用计数就减1;
当对象的引用计数为0时,说明此对象不再被任何指针指向,这时我们就可以将对象销毁,回收内存。
由于引用计数简单有效,除了 Objective-C 语言外,Microsoft 的 COM「Component Object Model」、C++11(基于引用计数的智能指针 share_prt)等语言也提供了基于
引用计数的内存管理方式。
举个例子:
新建工程,Xcode 默认开启的是 ARC,我们这里针对「AppDelegate.m」文件使用 MRC,进行以下配置:
选择目标工程,然后在「Build Phases」的「Compile Sources」下的「AppDelegate.m」文件配置编译器参数「Compiler Flags」值为「-fno-objc-arc」
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSObject *objO = [NSObject new];
NSLog(@"Reference Count: %lu", (unsigned long)[objO retainCount]); // 1
NSObject *objB = [objO retain];
NSLog(@"Reference Count: %lu", (unsigned long)[objO retainCount]); // 2
[objO release];
NSLog(@"Reference Count: %lu", (unsigned long)[objO retainCount]); // 1
[objO release];
NSLog(@"Reference Count: %lu", (unsigned long)[objO retainCount]); // 1
[objO setValue:nil forKey:@"test"]; // 僵尸对象,向野指针发送消息会报错(EXC_BAD_ACCESS)
return YES;
}