2012-12-15 37 views
11

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ì?

+0

Vâng, tại sao không ...? –

+1

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

+1

Điều này có vẻ giống như một câu hỏi hợp lệ. Tại sao các downvotes? –

Trả lời

12

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"].

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ể.

+1

"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. –

-1

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.

2

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 đó.

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