ARC 下须遵守的规则详解

在编写程序的过程中,在ARC有效的情况下,它会遵守一定的规则

1、不能使用retain/release/retainCount/autorelease。

2、不能使用NSAllocateObject和NSDeallocateObject
的。

3、须遵守内存管理的方法命名规则

4、不要显式调用dealloc

5、使用@autoreleasepool块替代NSAutoreleasePool

6、不能使用区域NSZone

7、对象型变量不能作为C语言结构体(struct/union)的成员

8、显式转换“id”和“void”


第一项:"不能使用retain/release/retainCount/autorelease。"   很明显,当程序使用了ARC进行编程的话,是禁止键入retain/release代码的,因为ARC有效时,调用了retain/release会造成编译器错误。


第二项:"不能使用NSAllocateObject和NSDeallocateObject"    其实

id objc = [[NSObject alloc]init];

苹果内部是直接调用NSAllocateObject来生成并持有对象的,他同retain一样,只有在没有使用ARC的情况下才可以使用。如果在ARC有效时使用了的话,会造成编译器错误,提示:not available in automatic reference mode.


第三项:"须遵守内存管理的方法命名规则"    在ARC无效的时候,用于对象生成/持有的方法必须遵守以下的命名规则

alloc

new

copy

mutableCopy

以上述名称开始的方法,应当返回调用方所应当持有的对象,这在ARC有效时也同样有效,只不过在ARC有效时,会更加的严格。并且,在ARC有效时,还需要再添加一条命名规则:

init

以init开始的方法的规则,要比alloc\new/copy/mutableCopy更加的严格,该方法必须是实例方法,而且必须是返回对象。返回的类型必须是id类型或者该方法声明类的对象类型,亦或者是该类的超类型或者子类型。该返回对象并不注册到autoreleasepool上,今本上只是对alloc方法返回值的对象进行初始化处理并返回对象。

例如:

id objc = [[NSObject alloc]init];

方法的命名规则可以是:

-(id)initWithObject:(NSObject *)obj

像下面这种命名规则是错误的,因为他没有返回对象:

-(void)initWithObject:(NSObject *)obj


第四项:"不要显式调用dealloc"    无论ARC是否有效,只要是对象的所有者不在持有该对象,该对象就会被废弃,对象被废弃时,无论ARC是否有效,都会调用dealloc方法

-(void)dealloc

{

    /*

     *此处是对象被废弃的时候,要实现的代码

     *

     */

}

就如使用C语言库的时候,需要使用如下方法释放内存

-(void)dealloc

{

    free(buffer_);

}

其实dealloc方法,在大部分情况下还适用于删除已注册的代理或者观察者

-(void)dealloc

{

    [[NSNotificationCenter defaultCenter]removeObserver:self];

}


在ARC无效的时候,还应该注意下面一点,

/*

 *ARC无效的时候,必须调用[super dealloc]

 *

 */

-(void)dealloc

{

    [super dealloc];  

}


第五项:" 使用@autoreleasepool块替代NSAutoreleasePool"    在ARC有效的时候,调用 NSAutoreleasePool会造成编译器出错

第六项:" 不能使用区域NSZone"   " NSZone"无论ARC是否有效,区域在现在的运行时系统(编译器宏__OBJC2__)中已经单纯的被忽略;

第七项:" 对象型变量不能作为C语言结构体(struct/union)的成员"  这句话其实就是,ARC有效时,在结构体struct内部不能出现对象,如下编译器就会报错

struct data{

    NSArray * arr;

};


报错如下:ARC forbids Objective-C objects in struct







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值