Dla mnie zdolność Objective-C do reagowania, opisu i bałaganu w otoczeniu jest tam, gdzie jest. Zaczyna się to, na poziomie podstawowym, z niezmienną zdolnością do odwoływania się do _cmd
, w dowolnym momencie i uzyskiwania aktualnego SEL
. Stamtąd, to zależy od ciebie co NSInvocation
inkantacje lub wykonawcze szykany wybrać do udziału w.Introspekcja bieżącego kontekstu bloku à la _cmd wewnątrz metody
Teraz wewnątrz bloku, nadal można nazwać _cmd
i dostać mgliste opis obecnego „kontekstu”, czyli
__30-[RoomController awakeFromNib]_block_invoke123RoomController
Opisowy? Tak. Informacyjny? Okay ... Ale nie tak przydatne. Jak uzyskać dynamiczne i dokładne informacje o środowisku wykonawczym wewnątrz bloku, w szczególności podpis wywołujący, argumenty itp.?
I have found a useful little method to "describe" a block z wyprzedzeniem, które daje dobry przykład rodzaju informacji, które mam zamiar zgromadzić W PRZESZŁOŚCI.
typedef void(^blockHead)(NSString*);
blockHead v = ^(NSString*sandy) { NSLog(@"damnDog",nil); };
Log([v blockDescription]);
[v blockDescription] = <NSMethodSignature: 0x7fd6fabc44d0>
number of arguments = 2
frame size = 224
is special struct return? NO
return value: -------- -------- -------- --------
type encoding (v) 'v'
flags {}
modifiers {}
frame {offset = 0, offset adjust = 0, size = 0, size adjust = 0}
memory {offset = 0, size = 0}
argument 0: -------- -------- -------- --------
type encoding (@) '@?'
flags {isObject, isBlock}
modifiers {}
frame {offset = 0, offset adjust = 0, size = 8, size adjust = 0}
memory {offset = 0, size = 8}
argument 1: -------- -------- -------- --------
type encoding (@) '@"NSString"'
flags {isObject}
modifiers {}
frame {offset = 8, offset adjust = 0, size = 8, size adjust = 0}
memory {offset = 0, size = 8}
class 'NSString'
nie można tak naprawdę wiedzieć nic o bloku wewnątrz bloku, chyba że można się do niego jakoś odwołać. BTW, dlaczego chcesz poznać te informacje? –
Ponieważ bloki API rozmnażają się ... często trudno jest powiedzieć dzwoniącemu bloku itp. Kompilator dopuszcza niedopasowane podpisy ...niepoprawna liczba argumentów i wiele metod o tej samej nazwie, ale różne rodzaje bloków itp. = współistnienie bez zarzutu ... Byłoby miło wiedzieć, czasami, co tak naprawdę się dzieje ... nie tylko co "Myślę, że" się dzieje. –
możesz sprawdzić typ bloku przed wywołaniem go, ale nie możesz wiele zrobić wewnątrz bloku, ponieważ jest on już wywoływany prawdopodobnie z niepoprawnymi parametrami. –