Mam obiekt i chcę wyświetlić wszystkie selektory, na które odpowiada. Wydaje się, że to powinno być całkowicie możliwe, ale mam problem ze znalezieniem interfejsów API.Selektory listy dla obiektu Objective-C
Odpowiedz
Jest to rozwiązanie oparte na funkcjach Runtime C:
class_copyMethodList zwraca listę metod klasy danego obiektu klasy otrzymać ze związku obiekt.
#import <objc/runtime.h>
[..]
SomeClass * t = [[SomeClass alloc] init];
int i=0;
unsigned int mc = 0;
Method * mlist = class_copyMethodList(object_getClass(t), &mc);
NSLog(@"%d methods", mc);
for(i=0;i<mc;i++)
NSLog(@"Method no #%d: %s", i, sel_getName(method_getName(mlist[i])));
/* note mlist needs to be freed */
Coś takiego powinno zadziałać (wystarczy umieścić go w obiekcie, który nas interesuje). Na przykład, jeśli masz obiekt, który jest delegatem i chcą wiedzieć, jakie są dostępne „haki” to będzie wydrukować wiadomości daje, że pojęcia:
-(BOOL) respondsToSelector:(SEL)aSelector {
printf("Selector: %s\n", [NSStringFromSelector(aSelector) UTF8String]);
return [super respondsToSelector:aSelector];
}
pamiętać, że odkrył to w iPhone programisty Cookbook więc nie mogę wziąć kredytu! Na przykład wyjście otrzymuję od UIViewController
który implementuje protokoły <UITableViewDelegate, UITableViewDataSource>
:
Selector: tableView:numberOfRowsInSection:
Selector: tableView:cellForRowAtIndexPath:
Selector: numberOfSectionsInTableView:
Selector: tableView:titleForHeaderInSection:
Selector: tableView:titleForFooterInSection:
Selector: tableView:commitEditingStyle:forRowAtIndexPath:
Selector: sectionIndexTitlesForTableView:
Selector: tableView:sectionForSectionIndexTitle:atIndex:
...
...
etc.,etc.
myślę zazwyczaj będziemy chcieli to zrobić w konsoli zamiast zaśmiecania kod z debugowania kodu. W ten sposób można to zrobić podczas debugowania w lldb:
(Zakładając, że obiekt t)
p int $num = 0;
expr Method *$m = (Method *)class_copyMethodList((Class)object_getClass(t), &$num);
expr for(int i=0;i<$num;i++) { (void)NSLog(@"%s",(char *)sel_getName((SEL)method_getName($m[i]))); }
Jest to również możliwe w przypadku Swifta:
let obj = NSObject()
var mc: UInt32 = 0
let mcPointer = withUnsafeMutablePointer(&mc, { $0 })
let mlist = class_copyMethodList(object_getClass(obj), mcPointer)
print("\(mc) methods")
for i in 0...Int(mc) {
print(String(format: "Method #%d: %s", arguments: [i, sel_getName(method_getName(mlist[i]))]))
}
wyjściowa:
251 methods
Method #0: hashValue
Method #1: postNotificationWithDescription:
Method #2: okToNotifyFromThisThread
Method #3: fromNotifySafeThreadPerformSelector:withObject:
Method #4: allowSafePerformSelector
Method #5: disallowSafePerformSelector
...
Method #247: isProxy
Method #248: isMemberOfClass:
Method #249: superclass
Method #250: isFault
Method #251: <null selector>
Testowany za pomocą symulatora 6s z systemem iOS 9.2, Xcode w wersji 7.2 (7C68).
wzorując odpowiedź JAL „s, w Swift można zrobić:
extension NSObject {
var __methods: [Selector] {
var methodCount: UInt32 = 0
guard
let methodList = class_copyMethodList(type(of: self), &methodCount),
methodCount != 0
else { return [] }
return (0 ..< Int(methodCount))
.flatMap({ method_getName(methodList[$0]) })
}
}
- 1. jQuery - 2 pseudo selektory?
- 2. jQuery parzyste/nieparzyste Selektory dla wielu elementów
- 3. Selektory CSS - jak wybrać "dla" w CSS?
- 4. Selektory czasowe tylko dla .NET WinForms?
- 5. ObjectiveC Parse Integer from String
- 6. Wdrożenie ObjectiveC protokół w szybkim
- 7. Różnica między NSLog oraz sprawozdania printf dla ObjectiveC
- 8. selektory jquery dla zwykłych obiektów javascript zamiast elementów DOM
- 9. selektory css a konwersja jquery
- 10. selektory jQuery: logiczne LUB
- 11. CSS: Selektory wielu atrybutów
- 12. ObjectiveC: gdzie zadeklarować prywatne właściwości instancji?
- 13. Dodawanie obiektu do listy Pythona
- 14. Wiele selektory w jQuery
- 15. Błąd: "Selektory nie zaimplementowane"
- 16. Unixowe selektory wieloznaczne? (Gwiazdki)
- 17. selektory rodzica jQuery
- 18. Kombajny Selektory atrybutów CSS
- 19. Zagnieżdżone selektory jQuery
- 20. selektory części jQuery
- 21. Powtarzające Pseudo-klasa Selektory
- 22. Selektory atrybutów CSS2 z Regeksem
- 23. Redux: lokalizowania Selektory z Reduktory
- 24. selektory jQuery dla parzystych/nieparzystych wierszy w tabeli
- 25. Serializować obiektu, gdy obiekt dziedziczy z listy
- 26. jQuery "to" plus inne selektory?
- 27. Selektory CSS> kontra przestrzeni
- 28. Wzór dla dynamicznego obiektu C#
- 29. asp.net CompositeDataBoundControl dla pojedynczego obiektu
- 30. Konwersja xml ciąg do listy mojego obiektu
Ta odpowiedź podaje metody klasy. Jeśli chcesz, aby metody, które obiekt zareagował, zastąpiły ten wiersz: 'Method * mlist = class_copyMethodList (object_getClass (t), &mc);' z tym jednym 'Method * mlist = class_copyMethodList (t, &mc);' – bugloaf
@bugloaf jak twój komentarz ma sens ? sygnatura obiektu object_getClass oczekuje zmiennej klasy? – abbood
@abbood Co nie rozumiesz mojego komentarza? Właśnie sprawdziłem teraz dokumentację i stoję za moim komentarzem. 'object_getClass' spodziewa się obiektu i zwraca klasę obiekt, którego argumentem jest instancja, jeśli 'class_copyMethodList' jest przekazywany obiekt klasy, zwróci metody klasy.Jeśli zostanie przekazany zwykły obiekt, zwróci metody na ten obiekt: – bugloaf