2012-09-25 26 views
8

我有一個核心數據對象,Account,表示爲NSManagedObject一個子類: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 

其中這種特殊的一個是由引起:

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

現在,我猜有一些班級在MessageUI.framework導致衝突,但我有幾個問題:

  1. 的應用程序編譯和運行得很好,沒有編譯時的名字在框架原理相沖突
  2. 其他組件ork似乎是前綴命名空間(即:MFMailComposeViewController),那麼理論賬戶不應該是MFAccount
  3. 我甚至沒有做#import <MessageUI/MessageUI.h>或稍微嚴格的#import <MessageUI/MFMailComposeViewController.h>,後者我檢查並沒有看到Account的定義,所以我不確定爲什麼可能的衝突甚至會被加載。
  4. 爲了確定,我重新生成了我的Core Data類,並重置了所有模擬器設置,但仍然沒有骰子。
  5. 立即從項目中刪除框架並立即構建設置可以解決問題。
+0

你試過重命名你的NSManagedObject子類嗎? – geraldWilliam

+0

@geraldWilliam:雖然我認爲這可以彌補這種情況,但我寧願不命名空間模型,如果沒有必要的話。我真的問過這個問題,因爲我想知道我錯過了什麼,因爲我的所有調查都導致了死路一條,如果這種情況或其他類似情況再次出現,我希望能夠解決它快速,直觀。 – Josh

+0

當然有道理。只是當我遇到類似的情況時,我已經命名了託管對象的子類「Message」,我只是將其重命名並解決了問題。繼續前進,我只是用一個前綴命名所有託管對象的子類,以避免這個問題。 – geraldWilliam

回答

8

我有這個發生在我身上,這個是確切的框架(該類被稱爲Broadcaster)。在這種情況下,私有Message框架鏈接MessageUI,並且此框架提供Account實現。

您可以驗證MessageUI框架,使一個新的項目加載一個Account類,並在應用程序委託的application:didFinishLaunchingWithOptions:方法,添加以下代碼:

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

在一個新的項目,這將打印accountClass = (null)但在添加MessageUI之後,它將打印accountClass = Account

此外,如果您在專用Message框架上使用class-dump,則會看到Account的接口聲明。

現在,你列出5個項目在您的文章作爲的問題,我會盡力解決這些問題

  1. 我不知道有足夠的瞭解鏈路時間過程與 框架的工作肯定地說,但我懷疑Message框架是弱鏈接的,因此鏈接時不會導致重複的符號錯誤。
  2. 面向公衆的正確命名,但一些沒有記錄的 不是。此外,衝突課程在私人Message框架中。
  3. 這根本不重要。編譯器將使用#import,但 運行時,所有的類裝入您的應用程序,有 沒有「可見性」或類似的東西在運行時執行。
  4. N/A
  5. 與其他證據相一致

至於行動的過程,我只是改名爲我的模型類有一個前綴。我不知道有任何其他解決方案。

+0

是的,重命名「帳戶」實體可以解決問題。 –

+0

您可以將「OutgoingMessage」添加到禁止列表中,至少在ios6上。哎喲。 – rgeorge

0

有可能消息框架根本就不是問題。像這樣的東西可能會發生意外的核心數據,比如當你以某種方式改變模型時。嘗試清理構建,刪除模擬器/硬件安裝的測試應用程序,然後再次運行。究其原因geraldWilliam提示重新命名它,我想,是解決這個問題,但它可能沒有必要重命名任何

退房此線程:Could not locate NSManagedObjectModel for Entity