面试题-ARC规则

来源:互联网 发布:腾讯视频网络不稳定 编辑:程序博客网 时间:2024/06/07 10:27

在ARC有效的情况下编译源代码,必须遵守一定的规则。下面就是具体的ARC的规则。

  1. 不能使用retain/release/retainCount/autorelease

    内存管理是编译器的工作,因此没有必要使用内存管理的方法。在ARC有效时,编译器使用了这些方法的源代码,会出现错误。
  2. 不能使用NSAllocateObject/NSDeallocateObject

    一般通过调用NSObject类的alloc类方法来生成并持有Objective-C对象。alloc实际上是通过NSAllocateObject函数来生成并持有对象的。同retain类方法一样,使用就会报错。同样地,也禁止使用用于释放对象的NSDellocateObject函数。
  3. 须遵守内存管理的方法的命名规则

    以alloc new copy mutableCopy开始的方法在返回对象时,必须返回给调用方所应当持有的对象。以init开始的方法必须是实例方法,并且必须要返回对象。返回的对象应为id类型或方法声明类的对象类型,抑或是该类的超类或子类型。该返回对象并不注册到autoreleasepool上。只是对alloc方法返回值的对象进行初始化处理并返回对象。
  4. 不要显示调用dealloc

    无论ARC是否有效,只要对象的所有者都不持有该对象,该对象就废弃。对象被废弃时,不管ARC是否有效,都会调用对象的dealloc方法。dealloc方法中可以删除已注册的代理或观察者对象。
  5. 使用@autoreleasepool块替代NSAutorelaeasePool
  6. 不能使用区域(NSZone)

    不管ARC是否有效,区域在现在的运行时系统(编译器宏__OBJC2__被设定的环境)中已被单纯地被忽略。
  7. 对象型变量不能作为C语言结构体(struct/union)的成员

    C语言的结构体(stuck或union)成员中,如果存在Objective-C对象型变量,变回引起编译器错误。C语言的规约上没有方法来管理结构体成员的生存周期。因为ARC把内存管理的工作分配给编译器,所以编译器必须能够知道并管理对象的生命周期。例如C语言的自动变量(局部变量)可使用该变量的作用域管理对象。但是对于C语言的结构体成员来说,这在标准上是不可实现的。要把对象型变量加入到结构体成员中是,可强制转化为void *或是附加__unsafe__unretained修饰符。附有__unsafe__unretained修饰符的变量不属于编译器的内存管理对象。如果管理时不注意赋值对象的所有者,可能会造成内存泄漏或程序崩溃。
  8. 显示转换“id”和“void”
0 0
原创粉丝点击