2016-05-26 14 views
5

Khi tạo một lớp con NSManagedObject xcode tạo hai tệp phụ MyObject+CoreDataProperties.h & MyObject+CoreDataProperties.m để giữ nội dung CoreData cách xa mã của chính chúng ta.Lớp con NSManagedObject được tạo ra + Tệp CoreDataProperties.m không thực sự được yêu cầu?

Điều này rất hay nhưng tôi nhận thấy trong một clip WWDC rằng họ không có tệp +CoreDataProperties.m trong ví dụ của họ. Vì vậy, tôi đã cố gắng loại bỏ chúng trong mã của tôi và mọi thứ biên dịch và chạy tốt mà không có chúng, chúng dường như không cần thiết chút nào.

Chúng được yêu cầu theo cách nào đó mà tôi đã bỏ qua, hoặc nếu không, thì tại sao xcode lại tạo ra chúng?

+2

Các tệp riêng biệt hữu ích nếu bạn muốn thêm các thuộc tính/biến mẫu bổ sung vào lớp, so sánh http://stackoverflow.com/questions/34063965/nsmanagedobject-subclass-property-in-category. –

+0

Đó là những gì 'MyObject. *' Dành cho, 'MyObject + CoreDataProperties được tạo tự động. *' Được cho là không bị ảnh hưởng để chúng có thể được tạo lại nếu bạn thay đổi mô hình của mình. – trapper

Trả lời

3

Câu trả lời ngắn:

Không, không cần thiết.

Câu trả lời dài:

Mục tiêu-C là ngôn ngữ lập trình liên kết động. Trong một hình thức ngắn có nghĩa là, mọi quyết định kiểu có thể được thực hiện trong thời gian chạy thay vì biên dịch thời gian và bạn có thể truy cập các thuộc tính của một và gửi tin nhắn đến một đối tượng mà không biết loại (lớp) của nó.

Nhưng không cần thiết cho khung Dữ liệu cốt lõi và bạn là người dùng của Dữ liệu cốt lõi và mô hình của bạn để biết loại đối tượng được quản lý cho loại thực thể. Nó thậm chí không cần thiết phải có một loại cụ thể cho một loại thực thể. (Tôi không tạo ra các lớp học rất thường xuyên và nếu tôi làm, tôi làm điều đó bằng tay.) Vì vậy, trái ngược với các ngôn ngữ lập trình khác các lớp được tạo ra là không cần thiết để cung cấp cho trình biên dịch một loại.

Tuy nhiên, trình biên dịch muốn xem ít nhất mọi phương pháp ít nhất một lần để lấy chữ ký (nhập tham số). Nếu không nó sẽ cảnh báo. Thậm chí nó có thể có mã làm việc như thế này ...

NSManagedObject *person = … 
NSString *firstName = [person firstName]; 

... cho một loại thực thể Person với một tài sản firstName, trình biên dịch sẽ cảnh báo bạn, rằng ông không biết gì về một phương pháp –firstName.

Thay vào đó bạn có thể gõ một cái gì đó như thế này:

NSManagedObject *person = … 
NSString *firstName = [person valueForKey:@"firstName"]; 

(Trình biên dịch biết -valueForKey:, vì đây là một phương pháp khai báo trong NSObject.)

Bên cạnh đó bạn sẽ có được những lợi ích như hoàn thành mã, kiểm tra lỗi đánh máy và vân vân. Nhưng bạn không cần phải sử dụng công cụ tạo mã của Xcode. Đơn giản chỉ cần khai báo một lớp như vậy và tại các thuộc tính tại giao diện. Người truy cập có thể được tạo động bằng cách sử dụng @dynamic. (Cá nhân tôi gần như không bao giờ sử dụng tạo mã tĩnh.)

Chỉnh sửa: Đã thêm kết quả của cuộc thảo luận vào các nhận xét.

Vì vậy, có giao diện (".h-tệp") của danh mục, trình biên dịch biết đủ để biên dịch toàn bộ mã mà không có cảnh báo. Điều này sẽ làm việc trong thời gian chạy, nếu nó được đảm bảo - hoặc được kiểm tra tại thời gian chạy - một thông báo tương ứng có thể được gửi đi. Điều này có ý nghĩa trong nhiều tình huống ngay từ đầu của Objective-C, i. e. cho các giao thức chuyển tiếp và không chính thức. Trong bối cảnh của dữ liệu lõi nó được sử dụng để tự động tạo ra các phương thức truy cập chuẩn. Tất cả mọi thứ hoạt động tốt mà không cần thực hiện bất kỳ.

Tuy nhiên, người ta muốn thực hiện vì một số lý do, i. e. vệ sinh về thay đổi giá trị. Trong trường hợp này, bạn có thể chỉnh sửa. Nhưng đối với hành vi tiêu chuẩn thì không cần thiết.

+0

Nhưng nó xuất phát từ tệp tiêu đề 'MyObject + CoreDataProperties.h', tôi đang nói về tệp' MyObject + CoreDataProperties.m'. Nếu tôi xóa các tập tin .m tôi không nhận được cảnh báo trình biên dịch và tất cả các mã IDE hoàn thành bình thường, không cần phải sử dụng 'valueForKey' hoặc bất cứ điều gì như thế. – trapper

+0

Đó là chính xác miễn là chúng ta đang nói về các thuộc tính, bởi vì sau đó trình biên dịch thấy các phương thức accessor (không cảnh báo) và Core Data có thể sinh ra chúng một cách linh động trong thời gian chạy (không có vấn đề rt) như đã đề cập. Tuy nhiên, nó là giống như "khó khăn" để làm như vậy và nó sẽ phá vỡ, khi bạn thêm các phương pháp khác hoặc ivars vào lớp, bởi vì chúng không được tạo động. –

+0

Các phương pháp khác và ivars đi vào 'MyObject.h' và' MyObject.m' mặc dù không có gì sẽ phá vỡ ở đó. – trapper

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