2015-01-27 2 views
0

이 시나리오는 다음과 같습니다.프로토콜 버퍼 코드의 EXC_BAD_ACCESS

a) protobuf 메시지 파일에서 생성 된 프로토콜 버퍼 클래스를 사용하는 정적 라이브러리입니다. 이 정적 라이브러리는 프로젝트 의존성이있는 응용 프로그램 (A)

나) protobuff 메시지는 모든 C를 족 및 allocated_setters 다발을 갖는다 ++ 코드

c)는 응용 프로그램 (C)에 사용되는 정적 라이브러리를 만듭니다. 무슨 일이 일어나고 무엇

는 :

정적 라이브러리는 응용 프로그램 (A)에 포함되어

앱이 실행되고, 내가 프로토콜 버퍼 클래스의 기본 세터 중 하나에 EXC_BAD_ACCESS 얻을.

inline void ABCD::set_companyname32chars(const char* value) { 
    set_has_companyname32chars(); 
    if (companyname32chars_ == &::google::protobuf::internal::kEmptyString) { 
    companyname32chars_ = new ::std::string; 
    } 
    companyname32chars_->assign(value); 
} 

마지막 행

companyname32chars_->assign(value) 

는 EXC_BAD_ACCESS를 생성한다. 나는이 세터를 사용하고 방법은 다음과 같이이다 :

ABCD* abcd = new ABCD(); 
abcd->set_companyname32chars("Andes"); 

키커는, 동일한 코드가 같은 전화에 응용 프로그램 C에 잘 실행됩니다.

정적 라이브러리는 다음 슬라이스, armv7, armv7s 및 arm64로 생성됩니다. 나는에 노력하고있어

아이폰은 아이폰 5와 아이폰 OS 8.2 (베타)

EXC_BAD_ACCESS 그러나, 메모리 함께 할 수있는 뭔가가있다

A) 동일한 코드가 비슷한 작동 않는 이유 응용 프로그램이 정적 라이브러리가 아닌 프로젝트 종속성으로 포함 된 경우 b) 디버깅 할 수있는 방법이 있습니까? 나는 좀비를 가능하게했지만 아무 소용이 없다.

답변

0

마치 :: google :: protobuf :: internal :: kEmptyString은 정적 라이브러리와 응용 프로그램에 서로 다른 값으로 존재하는 변수입니다. 따라서 companyname32chars가 둘 중 하나의 주소와 같지만 다른 주소가 아닌 경우이 이름은 인식되지 않습니다. 변수가 정적 라이브러리 코드 내에서 설정되었지만 응용 프로그램 코드에서 인라인을 통해 검사되는 경우 항상 발생합니다.

+0

의견을 보내 주셔서 감사합니다. setter ABCD * abcd = new ABCD(); abcd-> set_companyname32chars ("Andes"); 에서 정적 라이브러리에서 호출됩니다. 라이브러리에 대한 단 하나의 인터페이스는 하나의 API, OpenFile (NSString * filePath)입니다. 정적 링크 된 라이브러리 이외의 다른 참조 set_companyname32chars가 없습니다. – zyzzyxx