2010-07-01 5 views
2

빌드 유형에 따라 대상 iOS 4가 변경되는 iPhone 응용 프로그램에서 충돌이 발생했습니다.블록에서 ivar를 사용하여 다른 객체에 반환 됨

디버거 나에게에 갈 많은 아무것도 제공하지 않습니다, 그것은 EXC_BAD_ACCESS와

UIViewController *result = [self factory](self); 

에서 멈 춥니 다. self은 NSObject에서 상속 한 클래스입니다 (아래 NSObjectInheritor로 표시). 좀비가 활성화되었습니다. 나는 방법을 변경하려고 시도했습니다 factory 다음과 같은 세 가지 방법으로 결과. 이 디버그에서 작동

- (FactoryMethod) factory; 
{ 
    return [^ UIViewController * (NSObjectInheritor *newThing) 
    { 
     return [[ViewControllerClass alloc] initWithStuff:(boolValue ? foo : bar)]; 
    } autorelease]; 
} 

이 모두 디버그 충돌 및 특별 빌드 광고는 ... ... 임시의 충돌 그러나 이것은 디버그 및 광고 모두에서 작동

- (FactoryMethod) factory; 
{ 
    return [^ UIViewController * (NSObjectInheritor *newThing) 
    { 
    if(boolValue) 
    { 
     return [[ViewControllerClass alloc] initWithStuff:foo]; 
    } 
    else 
    { 
     return [[ViewControllerClass alloc] initWithStuff:bar]; 
    } 
    } autorelease]; 
} 

구축

boolValue이 inac된다
- (FactoryMethod) factory; 
{ 
    if(boolValue) 
    { 
    return [^ UIViewController * (NSObjectInheritor *newThing) 
    { 
     return [[ViewControllerClass alloc] initWithStuff:foo]; 
    } autorelease]; 
    } 
    else 
    { 
    return [^ UIViewController * (NSObjectInheritor *newThing) 
    { 
     return [[[ViewControllerClass alloc] initWithStuff:bar]; 
    } autorelease]; 
    } 
} 

내 이론이된다 : 특별하지만 아주 못생긴과 중복 반환 된 블록이 실행될 때 끝낼 수 없습니다. 그것은 SubclassOfNSObjectInheritor의 구현에

@interface SubclassOfNSObjectInheritor : NSObjectInheritor 
{ 
    BOOL boolValue; 
} 

@property (readonly) BOOL boolValue; 

(YES 또는 NO 물론 SubclassOfNSObjectInheritor의 init에서 할당) 및

@synthesize boolValue; 

입니다.

마지막 질문은 무엇이 잘못되었는지에 대한 나의 이론입니까? Ad Hoc 및 디버그 빌드에서 작동하는 것으로 표시된 세 번째 방법은 안전한가요? 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

답변

6

문제는 두 가지가 있습니다. 첫 번째는 블록을 과도하게 사용하고 두 번째는 블록이 스택에 만들어지고 메소드가 돌아올 때 사라집니다 (기본적으로 이전에 파괴 된 스택 프레임에 포인터를 반환하는 것입니다).

대신 블록을 복사 한 다음 자동으로 해제 한 다음 반환하십시오. copy 메시지로 목표 -c 방식으로이 작업을 수행 할 수 있으며 Block_copy() 함수를 호출 할 수 있습니다.

다양한 구성에서 충돌하는 것은 순전히 우연입니다. 따라서 구현 중 하나를 수정하려면

- (FactoryMethod) factory; 
{ 
    return [[^(NSObjectInheritor *newThing) 
    { 
    if(boolValue) 
    { 
     return [[ViewControllerClass alloc] initWithStuff:foo]; 
    } 
    else 
    { 
     return [[ViewControllerClass alloc] initWithStuff:bar]; 
    } 
    } copy] autorelease]; 
} 
+0

멋진 답변입니다. 또한 "빌드 및 분석"이이 특정 오류를 발견 했음에 유의하십시오. 그렇지 않은 경우 버그를 제출하십시오. – bbum

+0

감사합니다 - 분석기가 불평하지 않기 때문에 버그를 기록 할 것입니다. 사본을 추가하면 문제가 해결됩니다. –

관련 문제