2012-09-25 2 views
8

나는 NSManagedObject의 서브 클래스로 표현 코어 데이터 객체, Account을 가지고 :iOS - 핵심 데이터 모델이 메일 프레임 워크와 충돌합니까?

@interface Account : NSManagedObject 

나는 MessageUI.framework 그래서 내가 작성 이메일 뷰 컨트롤러를 얻을 수 있습니다 추가 할 때 내 전체 응용 프로그램은, 그러나, 잘 개발하고있다 모든 지옥은 느슨해집니다. 응용 프로그램 링크 및 컴파일 괜찮아요, 잘 실행됩니다. 그때까지는 이전에 작업 한 Account 개체와 인터페이스를 시작하기 전까지는 그 후, 나는이 받기 시작 :

의이 특별한 일이 발생했다
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', 
reason: '"Account" is not a subclass of NSManagedObject.' 
*** First throw call stack: 
(0x202b012 ... 0x2385) 
libc++abi.dylib: terminate called throwing an exception 

: 지금, 나는이 충돌을 일으키는 MessageUI.framework의 일부 클래스가 있음을 추측하고있어

// we need to insert a new account 
Account *newAccount = [NSEntityDescription 
          insertNewObjectForEntityForName:[Account entityName] 
          inManagedObjectContext:self.managedObjectContext]; 

,하지만 난 몇 가지 질문이 있습니다

  1. 앱을 컴파일하고, 더 컴파일시 이름이 framew에
  2. 의 다른 구성 요소를 충돌하지 잘 실행 ork은 접두사 - 네임 스페이스 (예 : MFMailComposeViewController) 인 것처럼 보이므로 이론 계정이 MFAccount이 아니어야합니까?
  3. 심지어 #import <MessageUI/MessageUI.h> 또는 약간 더 가늘게 보이는 #import <MessageUI/MFMailComposeViewController.h> (후자는 Account의 정의가 없음)을 볼 수 없으므로 가능한 충돌이 왜로드 될지 잘 모르겠습니다.
  4. 코어 데이터 클래스를 다시 생성하고 모든 시뮬레이터 설정을 재설정했지만 여전히 주사위를 다시 설정하지 않았습니다.
  5. 프로젝트 및 구성 설정에서 Framework를 제거하면 즉시 문제가 해결됩니다.
+0

NSManagedObject 하위 클래스의 이름을 바꾸려고 했습니까? – geraldWilliam

+0

@geraldWilliam : 상황을 해결할 것이라고 생각하지만, 필자는 필요하지 않은 경우 내 모델에 네임 스페이스를 사용하지 않을 것입니다. 모든 조사가 막 다른 골목으로 이어진 것처럼 내가 놓친 것을 알고 싶기 때문에이 질문을 정말로 물었습니다.이 상황이나 다른 상황이 다시 나타나면, 해결할 수 있기를 바랍니다. 직감으로. – Josh

+0

물론 이치에 맞습니다. 그것은 내가 관리 대상 객체 서브 클래스 "Message"의 이름을 비슷한 상황으로 만들었을 때 방금 이름을 변경하고 문제가 해결되었다는 것입니다. 앞으로이 문제를 피하기 위해 접두사가있는 모든 관리 대상 하위 클래스의 이름을 지정하는 것입니다. – geraldWilliam

답변

8

나는이 나에게 일어날 했어를 정확한 프레임 워크입니다 (클래스는 Broadcaster이라고 불렀습니다). 이 경우 전용 Message 프레임 워크는 MessageUI으로 연결되며이 프레임 워크는 Account 구현을 제공합니다.

당신은 MessageUI 프레임 워크는 새 프로젝트를 만드는하여 Account 클래스를로드되었는지 확인하고, 응용 프로그램 대리인의 application:didFinishLaunchingWithOptions: 방법으로, 다음 코드를 추가 할 수 있습니다 :이 accountClass = (null)를 인쇄하는 신선한 프로젝트에

NSString *account = @"Account"; 
Class accountClass = NSClassFromString(account); 
NSLog(@"accountClass = %@",accountClass); 

을하지만, MessageUI를 추가하면 accountClass = Account이 인쇄됩니다.

프레임 워크에서 class-dump을 사용하면 Account에 대한 인터페이스 선언이 표시됩니다.

지금, 당신은 내가 확실히 말할 프레임 워크 작업을위한 I 링크 타임 과정에 대해 충분히 모르는 그들에게

  1. 를 해결하려고합니다 질문으로 게시물에 5 개 항목을 나열 ,하지만 나는 Message 프레임 워크가 약하게 링크되어 있으므로 링크시 중복 된 심볼 오류가 발생하지 않을 것으로 생각됩니다.
  2. 공개 된 사람의 이름이 올바르게 지정되어 있지만 일부 문서화되지 않은 사람의 이름은 사람이 아닙니다. 또한 충돌하는 클래스는 개인 Message 프레임 워크에 있습니다.
  3. 전혀 문제가되지 않습니다. 컴파일러는 #import을 사용하지만 런타임에는 모든 클래스가 응용 프로그램과 함께로드되고 은 런타임에 적용되는 것과 같은 "가시성"이 없습니다.
  4. N
  5. /다른 증거가있는
  6. 일관

은 지금까지 행동의 과정으로, 난 그냥 접두사가 내 모델 클래스의 이름을 변경. 나는 다른 해결책을 모른다.

+0

예, "Account"엔티티의 이름을 변경하면 문제가 해결됩니다. –

+0

적어도 ios6에서는 "OutgoingMessage"를 금지 목록에 추가 할 수 있습니다. 아야. – rgeorge

0

메시지 프레임 워크가 전혀 문제가되지 않을 수도 있습니다. 이와 같은 상황은 모델을 어떻게 든 변경하는 경우와 같이 핵심 데이터에서 예기치 않게 발생할 수 있습니다. 빌드 정리, 시뮬레이터/하드웨어 설치 테스트 앱 삭제 및 다시 실행을 시도하십시오. geraldWilliam이 이름을 변경 제안 이유, 내가 생각은이 문제를 해결하는 것입니다,하지만 아무것도이 스레드

체크 아웃 이름을 바꿀 필요하지 않을 수도 있습니다 :이, Could not locate NSManagedObjectModel for Entity