被ARC弄糊涂了

时间:2012-04-24 06:44:28

标签: iphone xcode automatic-ref-counting

我在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点释放对象数组

欢迎任何评论

2 个答案:

答案 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仍然是错误的。