빌드 유형에 따라 대상 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 및 디버그 빌드에서 작동하는 것으로 표시된 세 번째 방법은 안전한가요? 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?
멋진 답변입니다. 또한 "빌드 및 분석"이이 특정 오류를 발견 했음에 유의하십시오. 그렇지 않은 경우 버그를 제출하십시오. – bbum
감사합니다 - 분석기가 불평하지 않기 때문에 버그를 기록 할 것입니다. 사본을 추가하면 문제가 해결됩니다. –