Sobes.tech
Middle — Senior

Hogyan valósítható meg a DirectDispatch mechanizmus az osztályban?

sobes.tech MI

Válasz az MI-től

A DirectDispatch mechanizmus iOS-en általában a metódushívások optimalizálásához kapcsolódik, megkerülve az Objective-C dinamikus üzenetküldő rendszerét. Egy hasonló mechanizmus implementálásához egy osztályban, közvetlen függvényhívásokat vagy metódusmutatókat lehet használni, elkerülve a selector dinamikus keresésével járó overheadet.

Egy például a megvalósításban tárolhatunk egy függvénymutatót és közvetlenül hívhatjuk:

typedef void (*DirectMethod)(id self, SEL _cmd);

@interface MyClass : NSObject {
    DirectMethod directMethod;
}
- (void)setupDirectDispatch;
- (void)directMethodImplementation;
@end

@implementation MyClass

- (void)setupDirectDispatch {
    directMethod = (DirectMethod)[self methodForSelector:@selector(directMethodImplementation)];
}

- (void)callDirectMethod {
    if (directMethod) {
        directMethod(self, @selector(directMethodImplementation));
    }
}

- (void)directMethodImplementation {
    NSLog(@"Közvetlen diszpécser módszer hívva");
}

@end

Így a callDirectMethod hívás megkerüli az objc_msgSend standard mechanizmusát, ami kritikus helyeken javíthatja a teljesítményt. Ezt a megközelítést azonban óvatosan kell alkalmazni, mivel csökkenti a rugalmasságot és hibákhoz vezethet, ha a módszer megváltozik.