Я пишу класс, в котором вы регистрируете объект и свойство для наблюдения.Когда для свойства устанавливается значение, отличное от nil
, вызывается зарегистрированный селектор обратного вызова (например, target-action).Селектор может иметь три разные подписи, и правильная вызывается в зависимости от того, какой тип был зарегистрирован.
Это прекрасно работает, но теперь я хочу добавить возможность регистрировать блок вместо селектора в качестве «функции обратного вызова».Можно ли узнать сигнатуру функции поставляемого блока и обработать обратный вызов по-разному в зависимости от типа поставляемого блока?
Например:
- (void)registerCallbackBlock:(id)block
{
if ([self isBlock:block] {
if ([self isMethodSignatureOne:block]) { /* */ }
else if ([self isMethodSignatureTwo:block]) { /* */ }
else { assert(false); } // bad Block signature
block_ = block; // assuming ARC code
}
else { assert(false); } // not a block
}
- (void)callBlock
{
if ([self isMethodSignatureOne:block_] {
block_(arg1_, arg2_); // needs casting?
}
else if ([self isMethodSignatureTwo:block_) {
block_(arg1_, arg2_, arg3_); // needs casting?
}
}
Есть идеи?
Я знаю, что могу создавать различные регистровые функции с конкретными аргументами typedef
'ed, но я бы предпочел иметь одну функцию, если это возможно.