내 애플리케이션에 큰 문제가 있으며이를 해결하는 방법이 궁금합니다. 너무 많이 검색했지만 유효한 해결책을 찾을 수 없습니다. 여기 내가 작업하고있는 시나리오.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_ACCESS은 main
방법입니다. 좀비가 활성화되어 있다면 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]
인 경우 충돌이 사라집니다.
프로젝트에서 "분석"을 실행하려고 시도 했습니까? 또한 "모든 예외"를 추가하면 중단 점이 도움이 될 수 있습니다. –
답장을 보내 주셔서 감사합니다. 예. 나에게 이상한 점은 좀비가 활성화되면 충돌이 발생하지 않는다는 것입니다. –
예외를 유발하는 메모리 경고와 같은 외부 조건이있을 수 있습니다. 좀비없이 앱을 실행할 때마다 예외가 발생합니까? –