2012-04-24 4 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

ту же функцию, вызывает так много EXEC плохая ошибка.

Даже я закрываю ARC всего проекта.

проблема все еще существует, похоже, я не могу освободить массив объектов в точке AAA

Добро пожаловать любой комментарий

+0

Почему вы освобождаете категориюArray в dealloc? Сохраняется ли она где-нибудь? Это может быть проблемой. –

+0

@property (nonatomic, сохранить) NSMutableArray * categoryArray; – arachide

ответ

2

Точка АРК является то, что он обрабатывает код сохранения/выхода для вас. Поскольку ваш массив «a» объявлен локально, когда эта функция заканчивается, ARC будет вставлять код для его выпуска. То же самое для dealloc - вам не нужно это с ARC (и на самом деле не может его использовать).

Но если вам не нравится или вы хотите узнать ARC, вам не нужно его использовать. Это вариант, когда вы создаете новый проект.

+0

Я пытаюсь закрыть arc follow: http: //stackoverflow.com/questions/9784082/forbid-arc-in-created-project, но он выглядит как дуга все еще работает! – arachide

2

Вы не используете ARC. Если бы вы были, код с использованием -release даже не был бы скомпилирован. Ни один из них не вызвал бы [super dealloc] в вашем методе -dealloc.

У вас есть обычная ошибка управления памятью. Вы назначаете a непосредственно переменной экземпляра categoryArray. Вы не используете сеттер, который синтезирован для свойства, и это сеттер, который выполняет правильное управление памятью. Поэтому categoryArray заканчивается тем, что указывает на освобожденный объект. Если вы использовали либо self.categoryArray = a, либо [self setCategoryArray:a], что эквивалентно утверждениям, ваша ошибка исчезнет.

Под ARC эта ошибка будет в основном скрыта. Переменная экземпляра categoryArray по умолчанию должна быть __strong, поэтому массив будет сохранен по крайней мере до тех пор, пока categoryArray указал на него, и вы не получите EXC_BAD_ACCESS ошибок. Тем не менее, он по-прежнему не может напрямую назначить ему, минуя setter, за исключением методов инициализации.

Смежные вопросы