-1

下面的代码我在 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 点释放对象数组

欢迎任何评论

4

2 回答 2

2

ARC 的重点是它为您处理保留/释放代码。由于您的数组“a”是在本地声明的,因此当该函数结束时,ARC 将插入代码为您释放它。与 dealloc 相同 - ARC 不需要它(实际上不能使用它)。

但是,如果您不喜欢或不想学习 ARC,则不必使用它。这是您创建新项目时的一个选项。

于 2012-04-24T06:56:18.540 回答
2

您没有使用 ARC。如果你是,代码 using-release甚至不会编译。也不会调用[super dealloc]你的-dealloc方法。

你所拥有的只是一个普通的内存管理错误。您正在a直接分配给实例变量categoryArray。您没有使用为属性合成的设置器,它是执行正确内存管理的设置器。因此,categoryArray最终指向一个已释放的对象。如果你使用self.categoryArray = aor [self setCategoryArray:a],它们是等效的语句,那么你的 bug 就会消失。

在 ARC 下,这个 bug 大部分是隐藏的。categoryArray实例变量默认为,因此__strong只要categoryArray指向它,数组就会被保留,并且不会EXC_BAD_ACCESS出错。但是,绕过设置器直接分配给它仍然是错误的,除了在初始化方法中。

于 2012-04-24T07:24:00.493 回答