自动引用计数器(四)-规则

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaoxingaiwo/article/details/81159858

在ARC有效的情况下编译源码,必须遵守一定的规则,下面就是ARC的规则:
·不能使用retain/release/retainCount/autorelease
·不能使用NSAllocateObject/NSDeallocateObject
·必须遵守内存管理的方法命名规则
·不要显示的调用dealloc
·使用@autoreleasepoo块代替NSAutoreleasePool
·不能使用区域NSZone
·对象类型变量不能作为c语言结构体的成员
·显示转换id和void
一、不能使用retain、release、retainCount、autorelease
二、不能使用NSAllocateObject/NSDeallocateObject
三、必须遵守内存管理的方法命名规则
在ARC无效的时候,用于对象生成/对象持有的方法必须遵守以下规则。
·alloc
·new
·copy
·mutableCopy
四、不要显示的调动dealloc
ARC会自动对此进行处理,因为不必书写[super dealloc],dealloc中只需记述废弃对象时所必须的处理。
五、对象类型变量不能作为c语言结构体的成员
c语言的结构体或者共用体成员中,如果存在oc对象类型变量,便会引起编译错误。
六、显示转换id和void*
这里写图片描述
但是在ARC有效时候便会引起编译器错误。
id类型或对象变量赋值给void*或者逆向赋值时需要进行特定的转换。如果只想单纯赋值可以使用“_bridge”转换。

id obj=[[NSObject alloc]init];
void p=(__bridge void )obj;
id 0=(_bridge id)p;

其安全性与赋值给_unsafe_unretained修饰符很相近,这样子赋值安全性会更低。另外还有两种转换。

ARC有效时:
id obj=[[NSObject alloc]init];
void p=(_bridge_retained void )obj;
ARC无效时:

这里写图片描述

Core Foundation框架是一组c语言接口,而Foundation是一组OC接口。如果将Foundation于CoreFoundation混合使用,则可以利用两个框架支架的“too_free bridging”。所谓的Toll-free bridging是说您可以在某个框架的方法或函数同时使用Core Foundatio和Foundation 框架中的某些类型。
ARC仅管理Objective-C指针(retain、release、autorelease),不管理CoreFoundation指针,CF指针由人工管理,手动的CFRetain和CFRelease来管理,注,CF中没有autorelease。
__bridge只做类型转换,但是不修改对象(内存)管理权;
__bridge_retained(也可以使用CFBridgingRetain)将Objective-C的对象转换为Core Foundation的对象,同时将对象(内存)的管理权交给我们,后续需要使用CFRelease或者相关方法来释放对象;
__bridge_transfer(也可以使用CFBridgingRelease)将Core Foundation的对象转换为Objective-C的对象,同时将对象(内存)的管理权交给ARC。

猜你喜欢

转载自blog.csdn.net/xiaoxingaiwo/article/details/81159858