我在Xcode 3.2上使用的代码非常好
@interface MoObject : UIViewController
{
NSMutableArray *categoryArray;
}
@property (nonatomic, retain) NSMutableArray *categoryArray;
@end;
@implementation MyObject
@synthesize categoryArray;
- (void)viewDidLoad
{
[super viewDidLoad];
NSMutableArray *a = [[NSMutableArray alloc] init];
categoryArray = a;
[a release]; //AAA:I can not release this, it does not report compiling error , but after some operation, it will cause exec bad error
}
- (void)dealloc {
[category release];
[super dealloc];
}
我转到Xcode 4.3.1 iOS 5.1
同样的函数会导致很多exec错误。
即使我关闭了整个项目的ARC。
问题仍然存在,看起来我无法在AAA点释放对象数组
欢迎任何评论
答案 0 :(得分:2)
ARC的重点在于它为您处理保留/释放代码。由于您的数组“a”是在本地声明的,当该函数结束时,ARC将为您插入代码释放它。同样适用于dealloc - 您不需要使用ARC(实际上不能使用它)。
但如果您不喜欢或想学习ARC,则不必使用它。这是您创建新项目时的一个选项。
答案 1 :(得分:2)
您没有使用ARC。如果是的话,使用-release
的代码甚至都不会编译。也不会在[super dealloc]
方法中调用-dealloc
。
你所拥有的只是一个普通的内存管理错误。您正在将a
直接分配给实例变量categoryArray
。您没有使用为属性合成的setter,它是执行适当内存管理的setter。因此,categoryArray
最终指向一个解除分配的对象。如果你使用self.categoryArray = a
或[self setCategoryArray:a]
这些是等效的陈述,那么你的bug就会消失。
在ARC下,这个bug大部分都是隐藏的。默认情况下,categoryArray
实例变量为__strong
,因此至少只要categoryArray
指向该数组就会保留该数组,并且不会出现EXC_BAD_ACCESS
错误。但是,除了初始化方法之外,直接分配给它,绕过setter仍然是错误的。