2009-09-03 25 views
42

Ví dụ: Tôi có phương thức -myFooBarMethod:withFoo:bar:moreFoo: và bên trong việc triển khai phương thức đó, tôi muốn tự động lấy tên của nó, như @"-myFooBarMethod:withFoo:bar:moreFoo: thành một NSString. Không cần gõ chữ ký của phương thức.Làm thế nào để có được tên hoặc chữ ký của phương pháp hiện tại vào một NSString?

Tôi cảm thấy rằng điều này phải làm điều gì đó với bộ chọn. Làm thế nào tôi có thể nhận được tên của phương pháp hiện tại (một trong đó thực thi mã) như NSString?

Trả lời

94

Mọi cuộc gọi phương thức cũng chuyển hai đối số ẩn: id có tên selfSEL có tên _cmd. Bạn có thể sử dụng để chuyển đổi NSStringFromSelector chọn phương pháp để một NSString:

NSStringFromSelector(_cmd); 
+12

Bạn cũng có thể sử dụng macro ** '__PRETTY_FUNCTION__' **, bộ tiền xử lý thay thế bằng một chuỗi C (char *) của tên phương thức. Nó cũng làm việc cho các hàm C. –

+1

Tôi không biết có một macro được gọi là '__PRETTY_FUNCTION__'. Tôi thích nó. Bây giờ tôi chỉ cần tìm một lý do để sử dụng nó trong mã của tôi ở đâu đó ... – GeneralMike

1

Theo Martin của câu trả lời, nhưng bạn cũng có thể muốn đọc thông tin Objective C 2.0 Runtime.

Chơi trong lòng can đảm như thế này có xu hướng dẫn đến khó quản lý mã, tuy nhiên.

+1

Có những lúc nó hợp lệ. – Abizern

+0

Ví dụ về nhà phát triển của Apple sử dụng nó để đăng nhập như thế này: 'NSLog (@"% @ đã nhận% @ ", tự, NSStringFromSelector (_cmd));' –

7

Là một ví dụ về nơi các loại điều này rất hữu ích: Đây là một mẫu cho các tin nhắn NSLog mà tôi sử dụng:

NSLog(@"%@ %@: %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), @"A Message"); 

này bãi lớp và phương thức để giao diện điều khiển khi đăng nhập.

16

Sử dụng __func__. Đây là một chuỗi C, vì vậy đối với một NSString, sử dụng [NSString stringWithUTF8String:__func__].

này có hai ưu điểm so với _cmd:

  1. Nó hoạt động trong C chức năng và phương pháp C++ cũng như phương pháp Objective-C. (Trong thực tế, __func__ là bắt buộc để tồn tại bởi C99.)
  2. Trong các phương pháp Mục tiêu-C, nó bao gồm loại phương thức (phương pháp lớp so với phương pháp mẫu) và tên lớp cũng như công cụ chọn. Ví dụ: "-[MyView drawRect:]".
Các vấn đề liên quan