Per me, la capacità di Objective-C di reagire, descrivere e creare problemi con l'ambiente circostante è a che punto è. Questo inizia, a un livello fondamentale, con una capacità costante di riferirsi a _cmd
, in qualsiasi momento, e ottenere l'attuale SEL
. Da lì, è a voi che cosa NSInvocation
incantesimi o cavillo runtime si sceglie di partecipare a.Introspezionare il contesto di blocco corrente, à la _cmd all'interno di un metodo
Ora, all'interno di un blocco, si può ancora chiamare _cmd
e ottenere una descrizione vaga del "contesto" attuale, vale a dire
__30-[RoomController awakeFromNib]_block_invoke123RoomController
Descrittivo? Sì. Informativo? Ok ... Ma non così utile. Come faccio a ottenere informazioni di runtime dinamiche e accurate all'interno di un blocco, in particolare la firma chiamante, args, ecc.?
I have found a useful little method to "describe" a block in anticipo che fornisce un buon esempio del tipo di informazioni che spero di raccogliere INSIDE nel blocco.
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'
non si può davvero sapere nulla del blocco stesso all'interno del blocco a meno che non si possa fare riferimento ad esso in qualche modo. A proposito, perché vuoi sapere queste informazioni? –
Come proliferano le API dei blocchi. Spesso è difficile dire al chiamante del blocco, ecc. Il compilatore consente le firme non corrispondenti ...numeri errati di argomenti e più metodi, con lo stesso nome, ma diversi tipi di blocchi, ecc. = coesistere senza lamentarsi ... Sarebbe bello sapere, a volte, cosa sta realmente accadendo ... non solo cosa "Penso che" stia accadendo. –
è possibile controllare il tipo del blocco prima di chiamarlo, ma non si può fare molto all'interno del blocco perché è già chiamato possibilmente con parametri errati –