2009-07-11 54 views
13

Các mã sau đây:NSConcreteData là gì và nó được định nghĩa ở đâu?

[[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:mapURL]] 

trả về một thể hiện của NSConcreteData như trái ngược với NSData (mà tôi mong đợi!). NSConcreteData đại diện cho, chính xác, và tại sao nó được trả về thay vì một thể hiện của NSData? Hơn nữa, lớp này được định nghĩa ở đâu? XCode phàn nàn rằng nó chưa được xác định, nhưng tôi không biết tôi nên bao gồm những gì để có được lớp.

Bất kỳ trợ giúp nào được đánh giá cao!

Trả lời

19

Khung nền tảng sử dụng các cụm lớp trong các khu vực nhất định để cung cấp giao diện chung cho các lớp khác nhau. Điều này có nghĩa là, khi bạn sử dụng API NSData để tạo đối tượng NSData, lớp thực tế được khởi tạo và trả lại khác với NSData, nhưng có thể và phải được xử lý và gọi là đối tượng NSData theo mã của bạn.

Vào cuối ngày, câu trả lời đơn giản là: bỏ qua sự tồn tại của NSConcreteData và xử lý nó như NSData.

Để biết thêm thông tin về các cụm lớp, vui lòng xem phần Nhóm lớp của Apple Cocoa Fundamentals Guide.

+4

tôi thấy gốc rễ của vấn đề của tôi là một tấm séc trên [sub isMemberOfClass: [NSData lớp]] thay vì [sub isKindOfClass: [NSData lớp]] Lợi nhuận sau đúng nếu phụ là một thể hiện của một lớp có nguồn gốc từ NSData, trong khi đó một trường hợp không phải là. Chúc mừng! – Codebeef

+2

Chỉ cần lưu ý, bạn không thể luôn coi NSContreteData là NSData, ví dụ: khi cố gắng tuần tự hóa JSON. Nó sẽ ném một ngoại lệ: Chấm dứt ứng dụng do ngoại lệ uncaught 'NSInvalidArgumentException', lý do: 'Loại không hợp lệ trong JSON viết (NSConcreteData)' – Tim

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