Vậy đó. Tại sao bất cứ ai muốn (ít nhất là một API công cộng) một phương pháp như vậy? Có thực tế sử dụng cho nó?Mục đích của phương pháp -self trong các lớp tuân thủ NSObject là gì?
Trả lời
Phương pháp self
hữu ích cho Mã hóa giá trị khóa (KVC).
Với KVC, bạn có thể xử lý một đối tượng giống như từ điển. Bạn có thể truy cập thuộc tính của đối tượng bằng cách sử dụng một chuỗi có chứa tên thuộc tính, như sau: [view valueForKey:@"superview"]
. Bạn đi xuống một chuỗi các thuộc tính bằng cách sử dụng một chuỗi có chứa một đường dẫn chính, như sau: [view valueForKeyPath:@"superview.superview.center"]
.
Vì NSObject
có phương thức self
, bạn có thể sử dụng self
làm khóa hoặc khóa chính: [view valueForKey:@"self"]
. Vì vậy, nếu bạn đang xây dựng đường dẫn chính của bạn theo lập trình hoặc đọc chúng từ một tệp, sử dụng "self"
làm khóa có thể cho phép bạn tránh viết một trường hợp đặc biệt.
Bạn cũng có thể sử dụng self
trong các vị từ, như thế này:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self beginswith \"foo\""];
NSArray *filteredArray = [arrayOfStrings filteredArrayWithPredicate:predicate];
Tôi không biết liệu NSPredicate
thực sự sử dụng các phương pháp self
(có lẽ qua KVC) trong trường hợp này. Nó chắc chắn là có thể.
"SELF" được ghi lại dưới dạng một hằng số đặc biệt trong NSPredicates, như "nil", "NULL" và một nhóm khác. Nó có thể được ánh xạ tới phương pháp "tự" thực sự, nhưng với tôi, tài liệu ngụ ý nó đặc biệt. –
Tôi nghĩ rằng nó liên quan đến thời gian chạy ObjC.
objc_msgSend(autoreleasePool, sel_registerName("drain"));
BOOL AppDel_didFinishLaunching(struct AppDel *self, SEL _cmd, void *application, void *options)
Đối số đầu tiên là tự. Tôi nghĩ rằng nó có cái gì đó để làm với điều đó. Tuy nhiên, trong tất cả sự trung thực, nó sẽ kết thúc như sau:
id self(struct id *self, SEL _cmd) {
return self;
}
.... Điều này có ý nghĩa hơn trước khi tôi bắt đầu viết câu trả lời này.
Tôi không chắc chắn tại sao "bản thân" được thêm vào ban đầu, nhưng một điều nó đã có ích cho việc bảo vệ con trỏ nội bộ đến các đối tượng. Khuyến nghị chính thức của Apple là chèn một cuộc gọi [foo self] sau khi bạn hoàn thành với con trỏ bên trong; các cuộc gọi phương thức không có gì chức năng nhưng đảm bảo trình biên dịch giữ foo xung quanh cho đến khi đó.
- 1. Mục đích của phương thức Expression.Quote của LINQ là gì?
- 2. Mục đích của lớp Expression là gì?
- 3. Giao thức phải tuân thủ Giao thức NSObject?
- 4. Mục đích của các lớp học một phần là gì?
- 5. Mục đích của các phương thức ví dụ trong Mô-đun không có lớp là gì?
- 6. Mục đích của String.IsInterned là gì?
- 7. Mục đích của lớp TestExecution trong MSTest là gì?
- 8. Mục đích của (<$) trong lớp Functor là gì?
- 9. Mục đích của phương pháp Rollback trong mẫu Đơn vị công việc là gì?
- 10. Mục đích của phương pháp này để truy cập các công cụ sửa đổi là gì?
- 11. Mục đích của hidebysig trong một phương pháp MSIL là gì?
- 12. Mục đích của trình nạp lớp Java là gì?
- 13. Mục đích của Parse Vexing là gì?
- 14. JQuery - Mục đích của cú pháp này là gì $ $ (function() {...});
- 15. Mục đích của HttpHeaders.TryAddWithoutValidation là gì?
- 16. Mục đích của `__metaclass__ = type` là gì?
- 17. `self` trong Akka là gì?
- 18. Mục đích của IntentSender là gì?
- 19. Mục đích của các khung nhìn trong SQL là gì?
- 20. mục đích là gì? "::" trong
- 21. Mục đích của flush() trong luồng Java là gì?
- 22. Mục đích của UIWindow là gì?
- 23. Java: Mục đích của setDoInput trong URLConnection là gì
- 24. Mục đích của phương thức setSelector trên lớp NSInvocation là gì?
- 25. Hiểu mục đích của các lớp trừu tượng trong Java
- 26. Mục đích của tệp vshost.exe là gì?
- 27. Mục đích của mô-đun Ninject là gì?
- 28. Mục đích của tệp pdb là gì?
- 29. Mục đích của __cxa_pure_virtual là gì?
- 30. Mục đích của ldexp là gì?
Vâng, tại sao không ...? –
Câu hỏi đặt ra là "Tại sao mọi người lại muốn ..." hoặc "Mục đích là gì ...", không phải "Tại sao nó lại ở đó?" – Matoe
Điều này có vẻ giống như một câu hỏi hợp lệ. Tại sao các downvotes? –