iOS ARC编译器规则和内存管理规则

时间:2022-08-22 13:44:38

iOS 开发当中,自动引用计数已经是标准的内存管理方案。除了一些老旧的项目或者库已经没有人使用手动来管理内存了吧。

ARC无疑是把开发者从繁琐的保留/释放引用对象逻辑中解脱出来。但这并不是万事大吉了,ARC当中一些编译器规则我们必须清楚。

ARC编译器规则

1、不能实现或调用 retain、release、autorelease或者retainCount方法。这一限制不仅针对对象,对选择器同样有效。因此,[obj release]

  或者@selector(reatin)是编译器错误。

2、可以实现 delloc方法,但是不能调用它们(在一个Controller实现delloc方法以释放对通知的监听)。不仅不能调用其他对象的delloc方法,也不能滴啊用超类。[super delloc]是编译时错误。

  但你仍然可以对CoreFoundataion类型的对象调用CFRetain、CFRelease等相关方法。

3、不能调用NSAllocateObject 和 NSDeallocateObject方法。应该使用alloc方法创建对象。运行时负责回收对象。

4、不能再C语言的结构体内使用对象指针。

5、不能再id类型和void* 类型之间自动转换。如果需要,那么你必须做显示转换。

6、不能使用NSAutoreleasePool ,要替换使用autoreleasepool快。

7、不能使用NSZone内存区域。

8、属性访问器名称不能以new开头,以确保与MRC的互操作 性。

9、由于XCODE从5.0开始默认使用的是ARC,如果非要使用MRC可以针对某一个文件 Targets -> Build Phases -> Complie Sources.选择源文件mrcClass.m, 在编译标记(Compiler Flags)里填写 -fno-objc-arc

整个项目还要使用MRC,请这样设置 Targets->Build Settings -> Objective-C Automatic Refrence Counting ,把YES->NO。

以上是编译器规则,不按照此规则,你会看到编译器时不时爆红。虽然编译器可以帮助提醒错误代码,但是如果对这些规则事先了解的话会避免写出编译器不高兴的代码。

内存管理规则(4个)

1、你拥有所有自己创建的对象,如new, alloc,copy,mutablecopy

2、你可以用 MRC中的retain或者ARC中的__strong引用来拥有任何对象的持有关系。

3、在MRC中,但不再西药某一个对象时,你必须立即使用release方法来放弃对该对象的持有关系,而在ARC中则无需任何特殊操作。持有关系会在对象失去最后的引用(方法中的最后一行代码)时被抛弃。

4、一定不能抛弃原本并不存在持有关系的对象。

实际开发当中需要注意的地方:

1、Block,block块内如果引用了对象的属性,成员变量或者方法,Block会持有该对象。使用__weakSelf 修饰符或者__weakSelf __strongSelf dance技术避免因为使用Block产生的循环引用。

2、NSTimer,在一个对象中创建一个定时器,定时器默认会对该对象强引用。所以定时器用完之后要先invalided 然后置空。

3、Delegate,一般一个对象的代理会声明为weak 或者 assign,只要注意这点不会有太大问题。

4、NSNotification,一个对象向通知中心注册自己为监听者,一定要在合适的时候(一般是在控制器对象的delloc方法中)释放监听。否则会内存泄漏。

具体内容参看下一篇: