Динамично вызовите метод класса в Objective C

Самой очевидной вещью была бы псевдозамена для всех тех классов, которые просто имеют отдельный метод, названный выполненным () или actionPerformed () или что-то как этот. Таким образом вместо того, чтобы создать Поток со встроенным Выполнимым, Вы использовали бы закрытие вместо этого. Не более мощный, чем, что мы имеем теперь, но намного более удобный и краткий.

Так делают нас потребность закрытия? Нет. Они были бы хороши иметь? Несомненно, пока они не чувствуют себя соединенными болтом на, поскольку я боюсь, что они были бы.

41
задан GregK 23 November 2009 в 17:59
поделиться

4 ответа

Вместо:

[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:. "

83
ответ дан 27 November 2019 в 00:26
поделиться

В Objective-C классы также являются объектами. Однако объекты класса обрабатываются по-разному, поскольку они могут вызывать методы экземпляра своего корневого класса ( NSObject или NSProxy в Какао).

Таким образом, можно использовать все методы экземпляра, определенные в NSObject для объектов класса, а также правильный способ динамического вызова метода класса:

[aClass performSelector:@selector(aSelector)];

Apple docs немного более конкретны.

4
ответ дан 27 November 2019 в 00:26
поделиться

Вы не следует реализовывать это самостоятельно.

Протокол NSObject имеет метод performSelector: , который делает именно это.

2
ответ дан 27 November 2019 в 00:26
поделиться

Этот встроенный метод вам нужен?

id objc_msgSend(id theReceiver, SEL theSelector, ...)

(См. справочную документацию по среде выполнения для этой функции.)

2
ответ дан 27 November 2019 в 00:26
поделиться