0

그래서 이전 .cpp 파일에 기능을 추가해야합니다. 따라서 Objective C로 다시 작성하는 것은 옵션이 아닙니다. 대신 Objective-C를 사용하여 필요한 기능을 추가했습니다 (NSDate/NSDateFormatter 함수가 많이 필요하기 때문에). 괜찮 았어. 하지만 getter (내보기 컨트롤러에서)를 호출하면이 오류가 발생합니다 : EXC_BAD_ACCESS. 여기 C++ 파일에서 NSDate를 사용하여 EXC_BAD_ACCESS를 수행하는 이유는 무엇입니까?

코드의 단편이다

//.h file ----------------- 
// C/C++ headers 
#import <Foundation/NSDate.h> 
#import <Foundation/NSDateFormatter.h> 

namespace MySpace { 
    class Session { 
     private: 
      // C++ stuff 
      NSDate * startTime; 
     public: 
      // C++ stuff 
      NSDate * getStartTime(); 
      Session(NSDate * startTime); 
    }; 
} 

// .cpp file ----------------- 
using namespace MySpace; 
Session:Session (NSDate * startTime) { 
    // unrelated code 
    if (startTime == nil){ 
     startTime = [NSDate date]; 
    } 
    setStartTime(startTime); 
    // unrelated code 
} 

void Session::setStartTime(NSDate * startTime){ 
    this->startTime = [startTime copy]; 
} 

NSDate * Session::getStartTime() { 
    return this->startTime; // here I get the EXC_BAD_ACCESS 
} 

전체 프로젝트는 오브젝티브 C++로 컴파일 및 ARC 활성화. 이 문제는 ARC에서 'startTime'멤버를 릴리스하고 getter를 호출 할 때 nil을 가리 키기 때문에 발생한다고 생각합니다.

어떻게이 문제를 해결할 수 있습니까?

감사합니다.

답변

1

것을보십시오 :

NSDate * Session::getStartTime() { 
    if (this == NULL) return nil; 
    return this->startTime; // here I get the EXC_BAD_ACCESS 
} 

변화는 NULL이 포인터에 getStartTime의 면역을합니다.

그게 도움이 되나요? 그렇다면 어딘가에 매달린 Session * 포인터를 사용하고 있습니다.

하지 않는 것이 2 단계. 그 때 :

@interface MyNSDate: NSDate 
@end 

@implementation MyNSDate 

- (id) init 
{ 
    self = [super init]; 
    if (self == nil) return nil; 

    NSLog(@"MyNSDate %@ initialized", self); 

    return self; 
} 

- (void) dealloc 
{ 
    // ARC: no super call 
    NSLog(@"MyNSDate %@ deallocated", self); 
} 

@end 

그리고 NSNSate *를 MyNSDate로 바꿉니다. dealloc의 메시지, 중단 점을 확인하십시오. 날짜가 할당 해제되었거나, 적절한지 아닌지, 또는 그 가설을 배제하는 것을 알아낼 수 있어야합니다.

내 생각에 어긋나는 다른 아이디어는 누락 된 사본 구성자입니다. ARC와 비 ARC 컴파일 단위간에 세션을 복사하는 경우 세션이 중단 될 수 있습니다. 넌 그렇게해서는 안되지만, 이봐, 일어난다.

Session::Session(const Session& rhs) 
{ 
    this->startTime = [rhs.startTime copy]; 
} 

Session& Session::operator=(const Session& rhs) 
{ 
    if (this->startTime != rhs.startTime) 
    { 
     this->startTime = [rhs.startTime copy]; 
    } 

    return *this; 
} 
+0

나는 그것을 시도했다. 아니, 이걸 반환하려고 할 때 멈춘다. 같은 문제 : EXC_BAD_ACCESS – subzero

+0

Eww. 그래 그리고 나서. 내 대답에 약간의 것을 추가. 시도 해봐. –

+0

옵션 2가 길이었습니다. 재미있는 사실 :이 수업에서는 문제가 없었습니다. 문제는 발신자가했습니다. 누군가 임시 객체의 수명을 연장시킨 후 ... 범위를 벗어나서이 문제를 일으켰습니다. 여기에 더 많은 정보 : http://stackoverflow.com/questions/2615162/return-value-not-a-reference-from-the-function-bound-to-a-const-reference-in Btw. 하나의 질문입니다. "this"는 언제 NULL이 될까요? Line : if (this == NULL)은 nil을 반환합니다. 감사합니다. – subzero

관련 문제