在编写程序的过程中,在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无效的时候,必须调用[super dealloc]
*
*/
-(void)dealloc
{
[super dealloc];
}
struct data{
NSArray * arr;
};
报错如下:ARC forbids Objective-C objects in struct