Tôi đến từ thế giới Java, vì vậy với tôi đó là tất cả object.foo()
, nhưng trong mục tiêu C, là đối tượng nhắn tin cách duy nhất để gọi một phương pháp?Cú pháp để gọi một phương thức trong Mục tiêu C?
[object foo];
Tôi đến từ thế giới Java, vì vậy với tôi đó là tất cả object.foo()
, nhưng trong mục tiêu C, là đối tượng nhắn tin cách duy nhất để gọi một phương pháp?Cú pháp để gọi một phương thức trong Mục tiêu C?
[object foo];
Điều đầu tiên bạn nghĩ đến là sử dụng @property và dấu chấm. Một lớp học với @property tên 'foo' cho phép bạn làm như thế này:
anInstance.foo = @"bar";
mà nghĩa đen dịch tại thời gian biên dịch để
[anInstance setFoo:@"bar"];
(tương tự với "thu khí")
Các cách khác là nâng cao hơn, chẳng hạn như sử dụng phương thức performSelector: của NSObject, hoặc các hệ thống khác như NSInvocation, vv Đi sâu hơn, có nhiều cách để gọi các phương thức trong thời gian chạy, với các hàm c (tất cả cú pháp này cuối cùng là c alling c-functions anyway); nhưng tôi chắc chắn đó không phải là những gì bạn đang có.
Có. Bạn có thể sử dụng cú pháp dấu chấm để nhận hoặc thiết lập các thuộc tính Objective C. Vì vậy, ví dụ: đặt văn bản trên nhãn UILabel * có thể được thực hiện hoặc [label setText:@"some text"];
hoặc label.text = @"some text";
Vì thầy giáo, tại sao không nhận được ở mức độ thấp:
objc_msgSend(object, sel_getUid("foo"), errVar);
Bạn có thể sử dụng KVC:
[label setValue:@"Some text" forKey:@"text"];
Có cân nhắc hiệu suất khi sử dụng '[]' trên '.'? – raffian
Thực ra, bạn đã sử dụng cụm từ ", đối tượng nhắn tin là cách duy nhất để gọi một phương thức?", Vì vậy câu trả lời kỹ thuật là "không". Nhắn tin dịch sang các cuộc gọi hàm thời gian chạy và bạn cũng có thể sử dụng chúng. Trong thực tế, bạn đã chạm vào một trong những "tính năng" cốt lõi của thời gian chạy, ràng buộc động của một thông điệp đến một phương thức. Các "phương pháp" (hoặc, thực hiện để được chính xác hơn) được nhìn lên lúc chạy cho mỗi tin nhắn được gửi đi. Kiểm tra điều này: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Introduction/Introduction.html –
Chúng thực sự giống hệt nhau khi chương trình thực sự chạy. Ý tôi là theo nghĩa đen. –