2011-11-26 26 views
11

Với một Objective-C loại type, người ta có thể có được encodingencoding và kích thước size loại một cách dễ dàng:Làm cách nào để có được kích thước của một loại mà một loại có mã hóa?

const char *encoding = @encode(type); 
size_t size = sizeof(type); 

Đặt một chút khác nhau, chúng ta có ánh xạ

@encode: type_t -> const char * 
sizeof: type_t -> size_t 

Điều này đặt ra hai câu hỏi :

(1) Giả sử rằng thay vì có loại, chúng tôi chỉ có mã hóa. Nó sẽ được tốt đẹp để có được một ánh xạ

sizeofencodedtype: const char * -> size_t 

như vậy mà cho mỗi type_ttype chúng tôi có mà

sizeofencodedtype(@encode(type)) = sizeof(type) 

Có một chức năng như vậy đã tồn tại? Nếu không, làm thế nào có thể đi về xây dựng một?

(2) Lý tưởng nhất là chúng ta có thể đảo ngược @encode mapping để tạo ra một bản đồ

decode: const char * -> type_t 

nhưng điều này dường như không được tốt vì type_t không phải là một loại C thực sự. Tôi đoán tôi có thể đợi @decode để thêm vào ngôn ngữ, nhưng điều đó không thực tế hoặc nhạy cảm với thời gian. Nhưng không thể khởi tạo một kiểu khi chạy bằng mã hóa của nó?

Tài liệu tham khảo: Objective-C Runtime Programming Guide - Type Encodings

Trả lời

12

NSGetSizeAndAlignment() thể làm điều này cho bạn. Nó cũng là một chức năng hữu ích nếu bạn đang cố gắng mò mẫm qua nhiều loại trong cùng một chuỗi.

+0

Cảm ơn bạn! Đây là _exactly_ những gì tôi cần. –

+1

Tôi đã dành hai giờ để cố gắng tìm ra những cách khác nhau để nói điều này và vấp phải nó từ một câu hỏi giới thiệu. Cảm ơn bạn! –

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