0

내 애플리케이션에 큰 문제가 있으며이를 해결하는 방법이 궁금합니다. 너무 많이 검색했지만 유효한 해결책을 찾을 수 없습니다. 여기 내가 작업하고있는 시나리오.ARC 및 NON-ARC 클래스를 혼합 한 프로젝트의 좀비 오브젝트와 이상한 동작 : EXC_BAD_ACCESS

비 -ARC 응용 프로그램이 있고 그 안에 ARC 클래스가 많이 있습니다. 이 클래스는 GMGridView에 속합니다. 이 클래스는 -fobjc-arc 지시문을 사용하여 프로젝트에 추가되었습니다.

이것은 내가 사용하고있는 코드입니다 (간단히하기 위해 핵심 부분 만 추가했습니다).

메모리 관리 부분

- (void)dealloc 
{ 
    [gmGridView setActionDelegate:nil]; 
    [gmGridView setDataSource:nil]; 
    [gmGridView release];  

    [super dealloc]; 
} 

의 viewDidLoad 섹션

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSInteger topBottomSpacing = 20; 
    NSInteger leftRifghtSpacing = 75; 
    NSInteger itemSpacing = 5; 

    UIView* mainView = [self view]; 

    GMGridView* gridView = [[[GMGridView alloc] initWithFrame:mainView.bounds] autorelease];  
    gridView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
    gridView.backgroundColor = [UIColor clearColor]; 
    gridView.style = GMGridViewStyleSwap; 
    gridView.itemSpacing = itemSpacing; 
    gridView.minEdgeInsets = UIEdgeInsetsMake(topBottomSpacing, leftRifghtSpacing, topBottomSpacing, leftRifghtSpacing); 
    gridView.centerGrid = NO; 
    gridView.actionDelegate = self; 
    gridView.dataSource = self;  
    [mainView addSubview:gridView]; 

    [self setGmGridView:gridView]; // retain policy 
} 

데이터 소스 섹션

- (GMGridViewCell *)GMGridView:(GMGridView *)gridView cellForItemAtIndex:(NSInteger)index 
{ 
    CGSize size = [self GMGridView:gridView sizeForItemsInInterfaceOrientation:[[UIApplication sharedApplication] statusBarOrientation]]; 

    GMGridViewCell *cell = [gridView dequeueReusableCell];  
    if (!cell) { 

     cell = [[[GMGridViewCell alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height)] autorelease]; 

     InternalView *view = [[[InternalView alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height)] autorelease]; 
     cell.contentView = view; 
    } 

    return cell; 
} 

좀비 객체를 사용하면 응용 프로그램이 잘 작동합니다. 오류 없음. 그러나 좀비 객체를 비활성화하면 응용 프로그램이 깨집니다. EXC_BAD_ACCESSmain 방법입니다. 좀비가 활성화되어 있다면 main에서 발생하는 오류에 대한 세부 정보를 볼 수 있기 때문에 이것은 매우 이상합니다.

나는 코드에서 autorelease 호출을 꽤 잘 모르겠다. 그러나 나는 그들이 누출 될 autorelease 풀에 객체를 넣지 않는다고 생각한다. 내가 dealloc 방법 [gmGridView release]을 언급하는 경우, 응용 프로그램 충돌을 중지 발견 비트를 조사

GMGridView* gridView = [[[GMGridView alloc] initWithFrame:mainView.bounds] autorelease]; 

cell = [[[GMGridViewCell alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height)] autorelease]; 

. 그렇다면이게 무슨 뜻입니까? release으로 전화하지 않으면 gmGridView 누설이 발생합니까?

의견이 있으십니까? 미리 감사드립니다.

편집

나는 - (GMGridViewCell *)GMGridView:(GMGridView *)gridView cellForItemAtIndex:(NSInteger)index 방법에 몇 가지 코드를 추가했다. 나는 그것을 처음으로 추가하는 것을 잊었다.

InternalView (UIView)의 dealloc 방법이 문제의 근원 인 것 같습니다. 여기 코드.

- (void)dealloc 
{  
    [addButton release]; // it's added to self addSubview, it has also a retain policy 
    [imageView release]; // it's added to detView addSubview, it has also a retain policy 
    [detView release]; // it's added to self addSubview, it has also a retain policy 

    [super dealloc]; 
} 

의견이 [detView release] 인 경우 충돌이 사라집니다.

+1

프로젝트에서 "분석"을 실행하려고 시도 했습니까? 또한 "모든 예외"를 추가하면 중단 점이 도움이 될 수 있습니다. –

+0

답장을 보내 주셔서 감사합니다. 예. 나에게 이상한 점은 좀비가 활성화되면 충돌이 발생하지 않는다는 것입니다. –

+0

예외를 유발하는 메모리 경고와 같은 외부 조건이있을 수 있습니다. 좀비없이 앱을 실행할 때마다 예외가 발생합니까? –

답변

1

Flex_Addicted, 코드에서 판단

, 우리는 MRR 코드를 찾고 있습니다 (즉, 비 ARC). 그것이 ARC라면, [super dealloc], -release 또는 -autorelease를 가질 수 없습니다.

의도 한 것입니까? 그렇다면 초기 할당 해제가 있습니다. 이 클래스를 ARC로 변환하는 것이 좋습니다. ARC는 정적 분석기와 함께 조기 할당 해제 문제를 발견하고 처리합니다.

앤드류

+0

+1입니다. 예, 그렇습니다. 조언 해주셔서 감사합니다. 나는 시도 할 것이다. –