2012-09-25 23 views
8

Tôi có một đối tượng Core Data, Account, thể hiện dưới dạng một lớp con của NSManagedObject:iOS - Mô hình dữ liệu cốt lõi xung đột với khung thư?

@interface Account : NSManagedObject 

toàn bộ ứng dụng của tôi đã phát triển tốt, tuy nhiên, khi tôi thêm các MessageUI.framework vì vậy tôi có thể nhận được một bộ điều khiển xem email soạn , tất cả các địa ngục phá vỡ lỏng lẻo. Các liên kết ứng dụng và biên dịch tốt, và chạy tốt. Cho đến khi, đó là, tôi bắt đầu giao tiếp với các đối tượng Account trước đây của tôi. Sau đó, tôi bắt đầu nhận được những:

*** 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 

này một đặc biệt trong số đó là do:

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

Bây giờ, tôi đoán rằng có một số lớp trong MessageUI.framework gây ra xung đột, nhưng tôi có một vài câu hỏi:

  1. ứng dụng biên dịch và chạy tốt, không có tên thời gian biên dịch xung đột
  2. các thành phần khác trong framew ork có vẻ là tiền tố-không gian tên (ví dụ: MFMailComposeViewController), vì vậy tài khoản lý thuyết không phải là MFAccount?
  3. Tôi thậm chí không làm #import <MessageUI/MessageUI.h> hoặc #import <MessageUI/MFMailComposeViewController.h> chặt chẽ hơn, sau này tôi kiểm tra và thấy không có định nghĩa của Account, vì vậy tôi không chắc chắn tại sao các xung đột có thể sẽ được tải.
  4. Để chắc chắn, tôi đã tạo lại các lớp Dữ liệu cốt lõi của mình và đặt lại tất cả cài đặt trình mô phỏng, vẫn không có súc sắc.
  5. Xóa khung khỏi dự án và thiết lập bản dựng ngay lập tức khắc phục sự cố.
+0

Bạn đã thử đổi tên lớp con NSManagedObject chưa? – geraldWilliam

+0

@geraldWilliam: Trong khi tôi cho rằng điều đó sẽ khắc phục tình trạng này, tôi không muốn đặt tên cho các mô hình của mình nếu không cần thiết. Tôi thực sự hỏi câu hỏi này bởi vì tôi muốn biết những gì tôi đang bỏ lỡ, vì tất cả các điều tra của tôi đã dẫn đến kết thúc chết, và nếu tình huống này hay cách khác như nó bao giờ bật lên, tôi muốn có thể giải quyết nó một cách nhanh chóng và trực giác. – Josh

+0

Chắc chắn điều đó có ý nghĩa. Nó chỉ là khi tôi đã chạy vào một tình huống tương tự, nơi tôi đã đặt tên cho đối tượng quản lý của tôi phân lớp "Message", tôi chỉ đổi tên nó và vấn đề đã được giải quyết. Di chuyển về phía trước, tôi chỉ đặt tên cho tất cả các lớp con đối tượng được quản lý của tôi với một tiền tố để tránh vấn đề này. – geraldWilliam

Trả lời

8

Tôi đã có điều này xảy ra với tôi, với điều này là khung chính xác (lớp được gọi là Broadcaster). Trong trường hợp này, khung riêng tư Message được liên kết bởi MessageUI và khung này cung cấp triển khai Account.

Bạn có thể xác minh rằng khuôn khổ MessageUI tải một lớp Account bằng cách làm cho một dự án mới, và trong phương pháp ứng dụng đại biểu của application:didFinishLaunchingWithOptions:, thêm đoạn mã sau:

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

Trên một dự án mới này sẽ in accountClass = (null) nhưng sau khi thêm MessageUI, nó sẽ in accountClass = Account.

Hơn nữa, nếu bạn sử dụng class-dump trên khung riêng tư Message, bạn sẽ thấy khai báo giao diện cho Account.

Bây giờ, bạn liệt kê 5 mục trong bài viết của bạn như câu hỏi này, tôi sẽ cố gắng giải quyết chúng

  1. Tôi không biết đủ về quá trình liên kết thời gian để làm việc với Khung để nói chắc chắn , nhưng tôi nghi ngờ khung Message được liên kết yếu và do đó sẽ không gây ra lỗi biểu tượng trùng lặp tại thời gian liên kết.
  2. Mặt đối diện được đặt tên chính xác nhưng một số không có giấy tờ là thì không. Ngoài ra, lớp xung đột nằm trong khung công tác riêng tư Message.
  3. Điều đó không quan trọng chút nào. Trình biên dịch sẽ sử dụng #import, nhưng tại thời gian chạy, tất cả các lớp được tải bằng ứng dụng của bạn và có không có "mức hiển thị" hoặc bất kỳ thứ gì tương tự được thực thi trong thời gian chạy.
  4. N/A
  5. Phù hợp với các bằng chứng khác

Theo như một quá trình hành động, tôi chỉ đổi tên thành lớp mô hình của tôi để có một tiền tố. Tôi không biết về bất kỳ giải pháp nào khác.

+0

Có, đổi tên thực thể "Tài khoản" sẽ khắc phục sự cố. –

+0

bạn cũng có thể thêm "OutgoingMessage" vào danh sách bị cấm, ít nhất là trên ios6. ouch. – rgeorge

0

Có thể khung thư không phải là vấn đề gì cả. Những thứ như thế này có thể xảy ra bất ngờ với dữ liệu cốt lõi, chẳng hạn như khi bạn thay đổi mô hình bằng cách nào đó. Hãy thử làm sạch bản dựng, xóa các ứng dụng thử nghiệm đã cài đặt phần cứng/phần cứng của bạn và chạy lại. Lý do geraldWilliam đề nghị đổi tên nó, tôi nghĩ, là để khắc phục vấn đề này, nhưng nó có thể không cần thiết phải đổi tên gì

Kiểm tra chủ đề này: Could not locate NSManagedObjectModel for Entity

Các vấn đề liên quan