博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Objective-C 内存管理
阅读量:5360 次
发布时间:2019-06-15

本文共 1458 字,大约阅读时间需要 4 分钟。

Objective-C内存管理使用的技术是引用计数(Reference Counting)。从开始的MRC(Manual),到后来的ARC(Automatic)。

使用ARC的好处:

1)程序员无需再写retain和release代码,很大程度上减少了开发工作量。

2)系统比程序员清楚对象什么时候该被销毁,降低了crash和leak的风险。

 

关于引用计数,《Objective-C 高级编程》的“开关房间的灯”例子讲得很形象,其中的对应关系如下:

1)灯,是对象。

2)人,是引用对象的变量。其实就是对象的地址,这里需要理解指针和指针指向的内容。

3)开灯:生成对象。

4)需要照明:持有对象。

5)不需要照明:释放对象。这里的释放特指release。

6)关灯:销毁对象。

 

上面提到引用计数机制中最核心的四种对象操作,现在来看看它们对应的方法: 

1)生成对象:以alloc/new/copy/mutableCopy开头的方法

// 生成并持有一个堆中的NSObject对象,obj是对象的指针,对象的引用计数+1id obj = [[NSObject alloc] init];id obj = [NSObject new];

实践证明,copy和mutableCopy方法并不一定会生成对象,具体见: 

2)持有对象:retain

3)释放对象:release

4)销毁对象:dealloc

  

NSAutoreleasePool重写了NSObject中的autorelease方法,一旦调用,就会crash:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];[pool autorelease]; // crash

 

ARC和MRC的本质一样,只是ARC自动帮程序员做了些事情。在一个app中,两者可以混用,最小单位是文件。

工程配置文件 -> 特定target -> Build Phases -> Compile Sources -> 特定文件: 

-fobjc-arc // 使用ARC,Xcode4.2及以上版本的默认值-fno-objc-arc // 不使用ARC

 

ARC中有四种对象所有权修饰符:

1)__strong

变量强引用对象,默认值

// 两种写法等价NSObject *obj = [[NSObject alloc] init];NSObject * __strong obj = [[NSObject alloc] init];

__strong变量超出作用域时,会释放它引用的对象 

 

2)__weak

 

3)__unsafe_unretained

不安全,不持有对象。如果对象被销毁,__unsafe_unretained变量会变成野指针,继续访问会导致crash,所以使用前一定要保证对象存在。

NSObject * __unsafe_unretained obj = [[NSObject alloc] init];// NSObject对象在init完,引用计数就为0,被销毁,再访问obj变量会导致crash

 

4)__autoreleasing

 

获取对象的引用计数,但其实这个函数在有些情况下并不靠谱,所以个人建议最好不用。

uintptr_t _objc_rootRetainCount(id obj)

 

转载于:https://www.cnblogs.com/yangwenhuan/p/8467535.html

你可能感兴趣的文章
js函数中this的指向
查看>>
c++ 引用方式传递数组
查看>>
HBase学习之路 (九)HBase phoenix的使用
查看>>
LeetCode() Remove Duplicates from Sorted Array II
查看>>
【svn】idea svn 文件上会出现一个破书
查看>>
cocos2d-x 3.0 场景切换特效汇总(转)
查看>>
The SortedMap Interface
查看>>
SniperOJ-leak-x86-64
查看>>
bzoj 4260: Codechef REBXOR (01 Trie)
查看>>
学好python
查看>>
css-IE中的border-radius和box-shadow
查看>>
利用bootstrap和webform的异步CRUD及分页
查看>>
HDUOJ 1879继续畅通工程(并查集)
查看>>
OC12_自动释放池
查看>>
Saiku资源帖
查看>>
解决手机页面中点击文本框,网页放大问题
查看>>
2-5
查看>>
牛客多校3 A-PACM Team(状压降维+路径背包)
查看>>
HDU - 4284 Travel(floyd+状压dp)
查看>>
1027 制作表格
查看>>