2016-03-23 6 views
5

में पैराम के रूप में मैं अन्य साथी डेवलपर्स द्वारा उपयोग किए जाने वाले उद्देश्य सी ढांचे का विकास कर रहा हूं।वैकल्पिक निर्भरता के तर्कों को पारित करने के लिए कैसे उद्देश्य सी फ्रेमवर्क फ़ंक्शन

इस ढांचे में मैं वैकल्पिक रूप से उपलब्ध होने पर वैकल्पिक रूप से अन्य ढांचे से उपलब्ध कक्षाओं का उपयोग करना चाहूंगा।

उदाहरण के लिए, इस समय मैं AdSupport.framework उपयोग कर रहा हूँ (यदि उपलब्ध है - एप्लिकेशन डेवलपर से जुड़े हुए) पर निम्न दृष्टिकोण के साथ:

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

अब हालांकि, मैं सार्वजनिक कार्यों के तर्कों करना चाहते हैं वैकल्पिक ढांचे के वर्गों को शामिल करने के लिए मेरे ढांचे का और मैं ऐसा करने में सक्षम नहीं हूं।

उदाहरण के लिए:

मैं एक समारोह करना चाहते हैं:

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

लेकिन CoreLocation.framework वैकल्पिक रूप से लिंक किया जाएगा और हो सकता है एक एप्लिकेशन के लिए उपलब्ध नहीं। मैं उपरोक्त AdSupport.framework के साथ एक समान दृष्टिकोण का अनुसरण कैसे कर सकता हूं?

मुझे लगता है मैं कुछ इस तरह कर सकता है ग्रहण किया:

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

या

+ (void) sendLocation: (id) myLoc; 

या

+ (void) sendLocation: (Class) myLoc; 

और उसके बाद किसी भी तरह निकालने का समन्वय करता है लेकिन यह है कि प्राप्त करने के लिए सक्षम नहीं था। अंतिम विकल्प (कक्षा) संकलित प्रतीत होता है लेकिन मुझे पैराम निकालने का कोई तरीका नहीं मिल रहा है ..

क्या कोई इससे मदद कर सकता है?

उत्तर

0

MapKit के साथ छोटा उदाहरण

हैडर (अपने अनुप्रयोग जब तक आप इसे अनुरोध करने के लिए लिंक नहीं किया जाएगा):

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

कार्यान्वयन फ़ाइल:

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

@implementation 

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

@end 

तो तुम हेडर से लिंक अंदर का। यह केवल तभी काम करेगा यदि आप बाइनरी प्रदान करते हैं, या केवल सेब-फ्रेमवर्क का उपयोग करते हैं। यदि आप स्रोत कोड प्रदान करते हैं और आप तृतीय-पक्ष ढांचे के साथ बातचीत करना चाहते हैं तो आपको निष्पादन चयनकर्ता, एनएसआईएनवोकेशन या अज्ञात ऑब्जेक्ट्स (आईडी) पर objc-runtime के साथ काम करना होगा।

संपादित करें:

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

कार्यान्वयन फ़ाइल::

#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 
NSInvocation

हैडर के साथ

उदाहरण

संबंधित मुद्दे