Самой очевидной вещью была бы псевдозамена для всех тех классов, которые просто имеют отдельный метод, названный выполненным () или actionPerformed () или что-то как этот. Таким образом вместо того, чтобы создать Поток со встроенным Выполнимым, Вы использовали бы закрытие вместо этого. Не более мощный, чем, что мы имеем теперь, но намного более удобный и краткий.
Так делают нас потребность закрытия? Нет. Они были бы хороши иметь? Несомненно, пока они не чувствуют себя соединенными болтом на, поскольку я боюсь, что они были бы.
Вместо:
[someOtherObject invokeSelector:@selector(someMethod) forClass:[SomeClass class];
call:
[[SomeClass class] performSelector:@selector(someMethod)];
Пример (с использованием GNUstep ...)
файл Ah
#import <Foundation/Foundation.h>
@interface A : NSObject {}
- (NSString *)description;
+ (NSString *)action;
@end
файл Am
#import <Foundation/Foundation.h>
#import "A.h"
@implementation A
- (NSString *)description
{
return [NSString stringWithString: @"A"];
}
+ (NSString *)action
{
return [NSString stringWithString:@"A::action"];
}
@end
Где-то еще:
A *a = [[A class] performSelector:@selector(action)];
NSLog(@"%@",a);
Вывод:
2009-11-22 23:32:41.974 abc[3200] A::action
хорошее объяснение из http://www.cocoabuilder.com/archive/cocoa/197631-how-do-classes-respond-to-performselector.html :
"В Objective-C , объект класса получает все методы экземпляра корневой класс для своей иерархии. Это означает, что каждый объект класса который происходит от NSObject, получает все методы экземпляра NSObject - включая performSelector:. "
В Objective-C классы также являются объектами. Однако объекты класса обрабатываются по-разному, поскольку они могут вызывать методы экземпляра своего корневого класса ( NSObject
или NSProxy
в Какао).
Таким образом, можно использовать все методы экземпляра, определенные в NSObject
для объектов класса, а также правильный способ динамического вызова метода класса:
[aClass performSelector:@selector(aSelector)];
Apple docs немного более конкретны.
Вы не следует реализовывать это самостоятельно.
Протокол NSObject имеет метод performSelector:
, который делает именно это.
Этот встроенный метод вам нужен?
id objc_msgSend(id theReceiver, SEL theSelector, ...)
(См. справочную документацию по среде выполнения для этой функции.)