मैं एक कस्टम प्रोटोकॉल को परिभाषित कर रहा हूँ के साथ दुर्घटनाओं। प्रोटोकॉल के मेरी कक्षा से बाध्य करने के लिएआपत्ति का उपयोग करते समय, कस्टम प्रोटोकॉल के कार्यान्वयन के गैर मान्यता प्राप्त चयनकर्ता
@interface NGSFacebookAuthProvider : NSObject <NGSAuthProvider>
@end
@interface NGSFacebookAuthProvider() <FBSessionDelegate>
@property BOOL ready;
@property(nonatomic, retain) Facebook *facebook;
@property(nonatomic, retain) NSArray *permissions;
@end
@implementation NGSFacebookAuthProvider
//Implementation of fbLogin, fbLogout and the methods in NGSAuthProvider that forward calls to self.facebook
- (NSString *)accessToken
{
return [self.facebook accessToken];
}
@end
मैं सेटअप Objection: तो एक एक Facebook प्रदाता है।
@interface NGSObjectionModule : ObjectionModule
@end
@implementation NGSObjectionModule
- (void)configure
{
self bind:[NGSFacebookAuthProvider class] toProtocol:@protocol(NGSAuthProvider)];
}
@end
मैं सेटअप वैश्विक इंजेक्टर:
@implementation NGSAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
ObjectionModule *module = [[NGSObjectionModule alloc] init];
ObjectionInjector *injector = [Objection createInjector:module];
[module release];
[Objection setGlobalInjector:injector];
}
मैं इस तरह मेरी RootViewController में यह उपयोग कर रहा हूँ:
@interface RootViewController : UITableViewController
@end
@interface RootViewController()
@property(nonatomic, retain) id<NGSAuthProvider> authProvider;
@end
@implementation RootViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.authProvider = [[Objection globalInjector] getObject:@protocol(NGSAuthProvider)];
}
- (void)processConfig {
NSString *token = [self.authProvider accessToken];
// use the access token
}
@end
जब मैं इस चलाने के लिए, मैं निम्नलिखित त्रुटि मिलती है:
2011-07-26 21:46:10.544 ngs[6133:b603] +[NGSFacebookAuthProvider accessToken]: unrecognized selector sent to class 0x30c7c
2011-07-26 21:46:10.546 ngs[6133:b603] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[NGSFacebookAuthProvider accessToken]: unrecognized selector sent to class 0x30c7c'
*** Call stack at first throw:
(
0 CoreFoundation 0x00e825a9 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x00fd6313 objc_exception_throw + 44
2 CoreFoundation 0x00e8417b +[NSObject(NSObject) doesNotRecognizeSelector:] + 187
3 CoreFoundation 0x00df3966 ___forwarding___ + 966
4 CoreFoundation 0x00df3522 _CF_forwarding_prep_0 + 50
5 ngs 0x0000324b -[RootViewController processConfig] + 731
6 ngs 0x000041a2 __33-[RootViewController viewDidLoad]_block_invoke_0 + 50
तो मेरी कक्षा आईएम प्रोटोकॉल plements। इसे सफलतापूर्वक id<NGSAuthProvider>
पर असाइन किया गया है। मैंने का उपयोग Objection का उपयोग करने के बजाय स्पष्ट रूप से करने की कोशिश की और यह अभी भी दुर्घटनाग्रस्त हो गया।
- (void)logSelectors:(id)obj
{
int i=0;
unsigned int mc = 0;
Method * mlist = class_copyMethodList(object_getClass([obj class]), &mc);
NSLog(@"%d methods", mc);
for(i=0;i<mc;i++)
NSLog(@"Method no #%d: %s", i, sel_getName(method_getName(mlist[i])));
free(mlist);
}
यह कुछ सरल है कि मुझे याद आ रही हो गया है:
मैं objc/runtime.h
तरीकों का उपयोग कर जो चयनकर्ताओं देखते हैं लेकिन केवल एक चीज यह पाता है initialize
है देखने के लिए चयनकर्ताओं के माध्यम से पाशन की कोशिश की। मैं कोको द्वारा परिभाषित प्रोटोकॉल का उपयोग करता हूं और यह समस्या नहीं है। मैंने बिना किसी मुद्दे के UIViewController
-आधारित प्रतिनिधियों के लिए कस्टम प्रोटोकॉल परिभाषित किए हैं।
मुझे लगता है कि ओब्जे-सी रनटाइम मेरे तरीकों को क्यों नहीं ढूंढ सकता है! अगर मैं id<NGSAuthProvider>
से NGSFacebookAuthProvider
बदलता हूं और इसे स्पष्ट रूप से बना देता हूं तो यह सब काम करता है।
समाधान:
समस्या मैं गलत समझा एक प्रोटोकॉल के लिए बाध्य करने के लिए कैसे किया गया था। एक तरीका यह है कि काम करता है:
@implementation NGSObjectionModule
- (void)configure
{
[self bind:[[[NGSFacebookAuthProvider alloc] init] autorelease] toProtocol:@protocol(NGSAuthProvider)];
}
@end
मैं करने के लिए एक प्रोटोकॉल के एक वर्ग के लिए बाध्य किया जाता है चाहते हैं क्या है, लेकिन आपत्ति शायद पता नहीं प्रारंभकर्ता कॉल करने के लिए?
है हाय, मैं के लिए भेजा [http://ravelantunes.com/blog/ परिपक्व-निर्भरता इंजेक्शन /]। लेकिन [- (शून्य) कॉन्फ़िगर करें { [स्वयं बाइंड: [MyUserService क्लास] toProtocol: @protocol (UserService)]; }] कक्षा परिभाषित करने में त्रुटि है। आपका समाधान काम किया !!!! –