2011-06-22 21 views
5

Tôi đang cố gắng để giao diện Lua với Objective-C, và tôi nghĩ rằng chuỗi chuyển đổi với NSSelectorFromString() có quá lớn trên không vì Lua phải sao chép tất cả các chuỗi để nội bộ hóa chúng (mặc dù tôi không chắc chắn về điều này).Tôi có thể giả định và xử lý SEL trong Objective-C như một con trỏ tới một thứ gì đó không?

Vì vậy, tôi đang cố gắng tìm cách nhẹ hơn để thể hiện bộ chọn trong Lua. Một bộ chọn Objective-C là một loại trừu tượng, nhưng nó được định nghĩa như một con trỏ đến một cái gì đó:

typedef struct objc_selector *SEL; 

Vì vậy, có vẻ an toàn để xử lý như một con trỏ thường xuyên, vì vậy tôi có thể vượt qua nó để Lua với lightuserdata. Điều này có ổn không?

+2

Việc sử dụng chuỗi C có giúp ích không? Bạn có thể sử dụng 'sel_registerName()' thay cho 'NSSelectorFromString()', và cái cũ chấp nhận một đối số chuỗi C. Nếu không, bạn có thể coi 'SEL' là' void * 'nếu bạn đang nhận bộ chọn từ mã Mục tiêu-C vào mã Lua/C. –

+0

Điều thú vị là, SEL đã là một con trỏ đến một chuỗi C ... Không phải là tôi muốn khuyến khích bạn sử dụng nó. – JustSid

+0

SEL là một con trỏ đến một chuỗi C nhưng đây là một chi tiết triển khai không được chấp nhận. – Lothar

Trả lời

2

Tôi không tin nó là an toàn để xử lý nó như một con trỏ (ngay cả một con trỏ void), bởi vì nếu điều này bao giờ thay đổi trong một triển khai trong tương lai hoặc thực hiện khác nhau của ngôn ngữ. Tôi đã không nhìn thấy một thông số Objective-C chính thức cho biết việc triển khai thực hiện là gì, nhưng thường khi các kiểu mờ như thế này được sử dụng, có nghĩa là bạn không cần phải biết chi tiết về kiểu cơ bản. Trong thực tế, cấu trúc được chuyển tiếp tuyên bố để bạn không thể truy cập bất kỳ thành viên nào của nó.

Vấn đề khác mà bạn có thể gặp phải là thực hiện so sánh bình đẳng: là bộ chọn tham chiếu đến một nhóm hằng số hoặc là mỗi bộ chọn có thể thay đổi. Một lần nữa, thực hiện xác định.

Sử dụng chuỗi C như được đề xuất ở trên có lẽ là đặt cược tốt nhất của bạn; ruby quản lý để sử dụng các biểu tượng cho bộ chọn và không có quá nhiều hình phạt về hiệu suất. Vì các chuỗi là const, lua không cần để sao chép chúng, nhưng có thể không sao cho an toàn. Nếu bạn có thể tìm cách để không sao chép các chuỗi, bạn có thể không thực hiện nhiều tác vụ đó.

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