由ARC

2012-04-24 55 views
-1

混淆下面的代碼我上的Xcode 3.2使用,效果很不錯由ARC

@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

同樣的功能會導致如此多的高管的嚴重錯誤。

即使我關閉了整個項目的ARC。

的問題仍然存在,它看起來像我不能點AAA發行對象數組

歡迎任何評論

+0

爲什麼在dealloc中釋放categoryArray?它保留在任何地方?這可能是問題。 – 2012-04-24 06:58:16

+0

@property(nonatomic,retain)NSMutableArray * categoryArray; – arachide 2012-04-24 07:02:17

回答

2

ARC的一點是,它處理保留/釋放代碼爲您服務。由於你的數組「a」是在本地聲明的,所以當這個函數結束時,ARC會爲你釋放它的代碼。與dealloc相同 - 你不需要使用ARC(並且實際上不能使用它)。

但是,如果你不喜歡或想學習ARC,你不必使用它。這是您創建新項目時的一個選項。

+0

我嘗試關閉弧如下:http://stackoverflow.com/questions/9784082/forbid-arc-in-created-project但它看起來很喜歡弧仍然有效! – arachide 2012-04-24 07:03:57

2

您沒有使用ARC。如果你是,使用-release代碼甚至不會編譯。您的-dealloc方法中也不會撥打[super dealloc]

你有什麼只是一個普通的內存管理錯誤。您正在將a直接分配給實例變量categoryArray。您沒有使用爲屬性合成的setter,而是執行適當內存管理的setter。因此,categoryArray最終指向一個釋放對象。如果您要使用self.categoryArray = a[self setCategoryArray:a]這些等效語句,那麼您的bug將消失。

在ARC下,這個bug大多是隱藏的。 categoryArray實例變量默認爲__strong,因此該陣列至少會保留至categoryArray指向它,並且您不會收到EXC_BAD_ACCESS錯誤。但是,直接分配給它,繞過setter,除了初始化方法之外,它仍然是一個錯誤。