2016-03-23 5 views
5

Opracowuję ramy celu c, które będą używane przez innych programistów.Jak przekazywać argumenty opcjonalnych zależności jako params w funkcji obiektu ramowego c

W tym kontekście chciałbym użyć, jeśli dostępne klasy z innych ram opcjonalnie, jeśli są one dostępne.

Na przykład, w tej chwili używam AdSupport.framework (jeśli jest dostępny - umieszczony przez dewelopera aplikacji) z następującym podejściu:

if (NSClassFromString(@"ASIdentifierManager")) { 
     NSString adString = [[[NSClassFromString(@"ASIdentifierManager") sharedManager] advertisingIdentifier] UUIDString]; 
} 

Jednak teraz chcę mieć argumenty funkcji publicznych z mojego frameworka, aby dołączyć klasy opcjonalnych zależności i nie jestem w stanie tego zrobić.

Na przykład:

chcę mieć funkcję:

+ (void) sendLocation: (CLLocation *) myLoc; 

ale CoreLocation.framework zostaną ewentualnie połączoną a może nie są dostępne dla aplikacji. Jak mogę postępować w podobny sposób z AdSupport.framework powyżej?

Przypuszczałem mógłby zrobić coś takiego:

+ (void) sendLocation: (NSClassFromString(@"CLLocation") *) myLoc; 

lub

+ (void) sendLocation: (id) myLoc; 

lub

+ (void) sendLocation: (Class) myLoc; 

a następnie wydobyć jakoś współrzędne, ale nie był w stanie osiągnąć. Ostatnia opcja (klasa) wydaje się kompilować, ale nie mogę znaleźć sposobu na wyodrębnienie paramerów.

Czy ktoś może w tym pomóc?

Odpowiedz

0

Krótki przykład z MapKit (nie będzie powiązany z aplikacją, chyba że o to poprosisz)

Header: Plik

@class MKMapView; 
@interface MyTestInterface : NSObject 
+ (void)printMapViewDescription:(MKMapView *)mapView; 
@end 

Realizacja:

#import "MyTestInterface.h" 
#import <MapKit/MapKit.h> 

@implementation 

+ (void)printMapViewDescription:(MKMapView *)mapView { 
    if ((NSClassFromString(@"MKMapView")) { 
     NSLog(@"%@", mapView); 
    } else { 
     NSLog(@"MapKit not available"); 
    } 
} 

@end 

więc odwołuje się do nagłówków wewnętrzny. Działa to tylko wtedy, gdy udostępniasz pliki binarne lub używasz tylko frameworków Apple. Jeśli podasz kod źródłowy i chcesz wejść w interakcję ze strukturami innych firm, musisz pracować z performSelector, NSInvocation lub objc-runtime na anonimowych obiektach (id).

Edycja:

Przykład z NSInvocation

Header: Plik

@class MKMapView; 
@interface MyTestInterface : NSObject 
+ (void)printMapViewFrame:(MKMapView *)mapView; 
@end 

realizacji:

#import "MyTestInterface.h" 

@implementation 

+ (void) printMapViewFrame:(id)mapView { 
    if ([mapView respondsToSelector:@selector(frame)]) { 
     NSMethodSignature *sig = [mapView methodSignatureForSelector:@selector(frame)]; 
     if (sig) { 
      NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig]; 
      [invocation setTarget: mapView]; 
      [invocation setSelector:@selector(frame)]; 
      [invocation invoke]; 
      CGRect rect; 
      [invocation getReturnValue:&rect]; 
      NSLog(@"%@", NSStringFromCGRect(rect)); 
     } 
    } 
} 

@end 
Powiązane problemy