見えないクラスのカテゴリを作成できないという点で、@pwc は正しいです。
でも...
私があなたに伝えようとしていることは、学習の練習として厳密に使用されるべきであり、いかなる種類の生産環境でも決して使用されるべきではありません.
- 実行時のイントロスペクションによって、いくつかの興味深い情報が明らかになります。「ブロック」という単語を含むクラスがいくつかあります。それらのいくつかは有望に見えます:
__NSStackBlock
、__NSMallocBlock
、__NSAutoBlock
、およびNSBlock
.
- いくつかの内省は、有望なクラスがから継承していることを示しています
NSBlock
したがって、どのブロックも のインスタンスまたはサブクラスになるように見えますNSBlock
。
次のように、オブジェクトにメソッドを作成できます。
@implementation Foo
- (void) doFoo {
//do something awesome with self, a block
//however, you can't do "self()".
//You'll have to cast it to a block-type variable and use that
}
@end
次に、実行時にそのメソッドをNSBlock
クラスに移動できます。
Method m = class_getInstanceMethod([Foo class], @selector(doFoo));
IMP doFoo = method_getImplementation(m);
const char *type = method_getTypeEncoding(m);
Class nsblock = NSClassFromString(@"NSBlock");
class_addMethod(nsblock, @selector(doFoo), doFoo, type);
この後、ブロックはメッセージに応答する必要がありdoFoo
ます。
自己責任で、実験目的でのみ使用してください。