IOS中内存管理那些事

2020-01-14 16:18:03王振洲
易采站长站为您分析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)等语言也提供了基于引用计数的内存管理方式。

IOS中内存管理那些事

举个例子:

新建工程,Xcode 默认开启的是 ARC,我们这里针对「AppDelegate.m」文件使用 MRC,进行以下配置:

选择目标工程,然后在「Build Phases」的「Compile Sources」下的「AppDelegate.m」文件配置编译器参数「Compiler Flags」值为「-fno-objc-arc」

IOS中内存管理那些事


- (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;
}