2010-01-19 30 views
32

Trong mục tiêu-C tôi có thể kiểm tra thời tiết một lớp hoặc trường hợp đã cho đáp ứng với một số bộ chọn nhất định. Nhưng làm cách nào để truy vấn một lớp hoặc cá thể cho tất cả các phương thức hoặc thuộc tính của một lớp (ví dụ: danh sách tất cả các phương thức hoặc thuộc tính)?có được tất cả các phương thức của một lớp hoặc trường hợp khách quan-c không?

Đã được ghi lại thành tài liệu hay không, nó có thể thực hiện được, ví dụ: WebView có thể truy vấn một đối tượng kịch bản lệnh cho tất cả các phương thức và thuộc tính nếu chúng được hiển thị cho tập lệnh hay không.

Trả lời

4

Điều này có thể thông qua objc_method_list. Để liệt kê các phương pháp của bạn, bạn sẽ phải đăng ký tất cả các phương pháp của bạn trước khi bàn tay.

Quá trình này là thẳng về phía trước: sau khi bạn đã khai báo hàm của mình, bạn có thể tạo một thể hiện của objc_method và đăng ký tên hàm. Sau đó, thêm objc_method đến một objc_method_list và cuối cùng vượt qua objc_method_list để class_addMethods ..

Dưới đây là một liên kết để giúp bạn bắt đầu: http://theocacao.com/document.page/327

33

bạn có thể làm điều này và nó cực kỳ cũng là tài liệu tại https://developer.apple.com/library/mac/documentation/cocoa/Reference/ObjCRuntimeRef/index.html

Để lấy tất cả các ví dụ hoặc lớp method của một class, bạn có thể sử dụng class_copyMethodList vấn và duyệt qua các kết quả. Ví dụ:

#import <objc/runtime.h> 

/** 
* Gets a list of all methods on a class (or metaclass) 
* and dumps some properties of each 
* 
* @param clz the class or metaclass to investigate 
*/ 
void DumpObjcMethods(Class clz) { 

    unsigned int methodCount = 0; 
    Method *methods = class_copyMethodList(clz, &methodCount); 

    printf("Found %d methods on '%s'\n", methodCount, class_getName(clz)); 

    for (unsigned int i = 0; i < methodCount; i++) { 
     Method method = methods[i]; 

     printf("\t'%s' has method named '%s' of encoding '%s'\n", 
       class_getName(clz), 
       sel_getName(method_getName(method)), 
       method_getTypeEncoding(method)); 

     /** 
     * Or do whatever you need here... 
     */ 
    } 

    free(methods); 
} 

Bạn cần thực hiện hai cuộc gọi riêng biệt cho phương thức này. Một cho các phương pháp dụ và một cho các phương thức lớp:

/** 
* This will dump all the instance methods 
*/ 
DumpObjcMethods(yourClass); 

Calling cùng trên metaclass sẽ cung cấp cho bạn tất cả các phương thức lớp

/** 
* Calling the same on the metaclass gives you 
* the class methods 
*/ 
DumpObjcMethods(object_getClass(yourClass) /* Metaclass */); 
+1

Đường dẫn nhập khó tìm, sử dụng: #import prewett

+0

Cảm ơn. Tôi đã chỉnh sửa câu trả lời để thêm mục nhập – Buzzy

+0

Cảm ơn, có thể là lỗi đánh máy, "DumpObjcMethods (object_getClass (yourClass)/* Metaclass * /);" phải là: "DumpObjcMethods (object_getMetaClass (yourClass)/* Metaclass * /);" – Joey

17

Ngoài buzzy câu trả lời. Đối với mục đích gỡ lỗi, bạn có thể sử dụng phương pháp riêng tư -[NSObject _methodDescription].

Hoặc trong LLĐB:

(lldb) po [[UIApplication sharedApplication] _methodDescription] 

hoặc trong mã:

@interface NSObject (Private) 
- (NSString*)_methodDescription; 
@end 

// Somewhere in the code: 
NSLog(@"%@", [objectToInspect performSelector:@selector(_methodDescription)]); 

đầu ra sẽ trông như sau:

<__NSArrayM: 0x7f9 ddc4359a0>: 
in __NSArrayM: 
    Class Methods: 
     + (BOOL) automaticallyNotifiesObserversForKey:(id)arg1; (0x11503b510) 
     + (id) allocWithZone:(_NSZone*)arg1; (0x11503b520) 
     + (id) __new:::::(const id*)arg1; (0x114f0d700) 
    Instance Methods: 
     - (void) removeLastObject; (0x114f669a0) 
     - (void) dealloc; (0x114f2a8f0) 
     - (void) finalize; (0x11503b2c0) 
     - (id) copyWithZone:(_NSZone*)arg1; (0x114f35500) 
     - (unsigned long) count; (0x114f0d920) 
     - (id) objectAtIndex:(unsigned long)arg1; (0x114f2a730) 
     - (void) getObjects:(id*)arg1 range:(_NSRange)arg2; (0x114f35650) 
     - (void) addObject:(id)arg1; (0x114f0d8e0) 
     - (void) setObject:(id)arg1 atIndex:(unsigned long)arg2; (0x114f99680) 
     - (void) insertObject:(id)arg1 atIndex:(unsigned long)arg2; (0x114f0d940) 
     - (void) exchangeObjectAtIndex:(unsigned long)arg1 withObjectAtIndex:(unsigned long)arg2; (0x114f8bf80) 
     ...... 
in NSMutableArray: 
    Class Methods: 
     + (id) copyNonRetainingArray; (0x11ee20178) 
     + (id) nonRetainingArray; (0x11ee201e8) 
     + (id) nonRetainingArray; (0x120475026) 
     + (id) arrayWithCapacity:(unsigned long)arg1; (0x114f74280) 
     ...... 
+1

Câu trả lời hay nhất cho đến nay – mafonya

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