2010-08-14 37 views
11

Có một số chức năng lấy làm đối số @selector (methodName). Tôi đã sử dụng NSLog để tìm hiểu @selector là gì và nó trả về một số nguyên. Nó trông giống như một PID, nhưng khi tôi chạy ps rìu mà PID không thể được tìm thấy. Số nguyên đó đại diện cho cái gì và tại sao chúng ta phải sử dụng @selector tất cả thời gian thay vì chỉ truyền tên phương thức?Điều gì thực sự là một @selector?

+7

'@ selector' literals không đánh giá các số nguyên. In bất cứ thứ gì dưới dạng số nguyên sẽ không bao giờ thất bại, mặc dù nếu bạn thử kích thước sai số nguyên, nó có thể in kết quả sai (một phần của giá trị thực tế bị tắt). Quan trọng hơn, in những thứ không phải là số nguyên như số nguyên sẽ “làm việc” (nó sẽ in một số) nhưng không đạt được gì (số sẽ vô dụng đối với bạn). Như Dave DeLong đã nói với bạn, một '@ selector' chữ đánh giá thành' SEL', cái mà (trong thực thi hiện tại) thực sự là một con trỏ. –

+0

Không có bộ chọn nào là số nguyên. Bạn thấy điều này khi bạn tháo rời mã. Nhưng từ quan điểm Objective-C, nó không phải là một số nguyên. Cũng có thể nói rằng đó là một giá trị vô hướng có thể chính xác hơn. – Lothar

Trả lời

35

@selector() là chỉ thị của trình biên dịch để biến bất kỳ nội dung nào bên trong dấu ngoặc đơn thành một số SEL. A SEL là loại để chỉ ra tên phương thức, nhưng không triển khai phương pháp. (Đối với điều đó, bạn cần loại khác, có thể là IMP hoặc Method) Dưới mui xe, một SEL được triển khai dưới dạng char*, mặc dù dựa vào hành vi đó không phải là một ý tưởng hay. Nếu bạn muốn kiểm tra những gì SEL bạn có, cách tốt nhất để làm điều đó là để biến nó thành một NSString* như thế này:

NSLog(@"the current method is: %@", NSStringFromSelector(_cmd)); 

(Giả sử bạn biết rằng _cmd là một trong những thông số ẩn của mỗi cuộc gọi phương pháp, và là SEL tương ứng với phương pháp hiện tại)

Objective-C Programming Language Guide có nhiều thông tin hơn về chủ đề này.

+1

+1 để biết chi tiết. – harshalb

+9

'SEL' không thực sự là một chuỗi C nữa; nó trỏ đến một loại đục được định nghĩa trong libobjc. Thành viên đầu tiên là một chuỗi C cho các mục đích tương thích, nhưng bạn không nên dựa vào đó; mã thích hợp sử dụng 'sel_getName' để thực sự truy cập thành viên C-string, hoặc' NSStringFromSelector' để tạo một NSString từ nó. –

+0

@Peter cảm ơn vì đã làm rõ. –

-2

Tôi nghĩ nhìn vào việc thực hiện Objective-C có thể tốt cho một sự hiểu biết:

Một bộ chọn là một giá trị số nguyên. Nhưng loại của nó khác với các giá trị số nguyên C thông thường, do đó bạn không thể gán chúng.

Tên bộ chọn như "methodName" là chuỗi đại diện duy nhất tên cho số nguyên này.

Các ngôn ngữ và hệ thống khác gọi chuỗi chương trình duy nhất này là chuỗi số nguyên để ánh xạ nguyên tử (Windows) hoặc quark (GTK).

Mục tiêu-C giữ tất cả các chức năng cho một lớp bên trong một hashtable. Khóa hashtable là một số nguyên. Thư viện thời gian chạy Objective-C tra cứu hàm hashtable trên mọi lời gọi phương thức. Không có số nguyên duy nhất nó sẽ chậm hơn nhiều để thực hiện việc tra cứu quan trọng này.

Bộ chọn không phải là một con trỏ mờ đục đối với cấu trúc nữa. Với MacOSX 10.6 chức năng thời gian chạy obj_send thực hiện lời gọi phương thức Objective-C đang sử dụng phép toán số học trên bộ chọn lúc đầu để tìm hiểu xem nó có giữ lại, phát hành, thông báo autorelease và làm điều gì đó trong trường hợp đặc biệt này không. Ví dụ chỉ đơn giản là quay trở lại trong trường hợp bạn đang sử dụng bộ thu gom rác.

+0

Um, "hoạt động số nguyên" được đề cập chỉ đơn giản là so sánh với một giá trị đã biết, giống với số nguyên và con trỏ. Ở cấp độ lắp ráp, chúng cũng giống nhau. Trong thực tế, SELs vẫn là con trỏ chuỗi C trong nội bộ trong tất cả các thời gian chạy của Apple. (Chúng là một cấu trúc trong gcc và GNUstep runtimes.) Tuy nhiên, chúng được khai báo là 'typedef struct objc_selector * SEL' để tạo ra một loại đục, và việc thực hiện có thể thay đổi ý nghĩa bất cứ lúc nào. –

+0

Trong trường hợp này, bộ chọn sẽ trỏ đến vị trí bộ nhớ hợp lệ. Họ có? Và những gì GNUstep không liên quan đến nó ra khỏi giải đấu. – Lothar

+0

Tôi không thể tìm thấy bài viết nữa nhưng nếu chúng là con trỏ đơn giản, làm cách nào để so sánh đơn lẻ có thể là nhánh đường dẫn nhanh cho 3 bộ chọn khác nhau? Cần phải có nhiều hơn sau này trong MacOSX 10.6 – Lothar

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