2011-08-16 13 views
5

पर कॉल करें, मैं एक चयनकर्ता को पैरामीटर के रूप में पास करने और इसे बाद में निष्पादित करने का प्रयास कर रहा हूं। लेकिन मैं एक SIGABRT त्रुटि मिलती है जब मैं कंसोल में अगले त्रुटि के साथ चयनकर्ता कॉल करने के लिए प्रयास करें:उद्देश्य-सी: पास पैरामीटर के रूप में चयनकर्ता और फिर इसे

समाप्त एप्लिकेशन न आया हुआ अपवाद 'NSInvalidArgumentException', कारण की वजह से: '- [HttpRequest OnFinishConn:]: गैर मान्यता प्राप्त चयनकर्ता उदाहरण 0x7834c80 '

HttpRequest.h

#import <Foundation/Foundation.h> 

@interface HttpRequest : NSObject 
{ 
    @private SEL onEndSel; 
    @private NSMutableData* receivedData; 
} 
-(void) StartRequest:(NSString *) url 
      parameters:(NSString*) params 
      onEndSelector:(SEL) selector; 
@end 

HttpRequest.m

के लिए भेजा
#import "HttpRequest.h" 

@implementation HttpRequest 

-(void) StartRequest:(NSString *)url 
      parameters:(NSString*)params 
      onEndSelector:(SEL)selector 
{ 
    receivedData = [[NSMutableData alloc] init]; 
    NSMutableURLRequest *request = 
    [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:url]]; 
    [request setHTTPMethod:@"POST"]; 
    [request setHTTPBody:[params dataUsingEncoding:NSUTF8StringEncoding]]; 
    onEndSel = selector; 
    NSURLConnection* conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 


} 
-(void) connectionDidFinishLoading:(NSURLConnection*) connection 
{ 
    //NSLog([[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding]); 
    [self performSelector:onEndSel withObject:[[NSMutableData alloc] initWithData:receivedData]]; 
} 
-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ 
    [receivedData appendData:data];  
} 
@end 

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    //self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    // Override point for customization after application launch. 
    //self.window.backgroundColor = [UIColor whiteColor]; 
    HttpRequest* req = [[HttpRequest alloc] init]; 
    SEL mysel = @selector(OnFinishConn:); 
    NSString * url = [[NSString alloc] initWithString:@"http://www.google.es"]; 
    [req StartRequest:url parameters:@"a" onEndSelector:@selector(OnFinishConn:)]; 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 
-(void)OnFinishConn:(NSMutableData *)data 
{ 
    NSLog([[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); 
} 

मैं उद्देश्य सी में नए हूँ, इसलिए कृपया धैर्य रखें।

+0

हालांकि यह आपके प्रश्न का उत्तर नहीं दे रहा है, तथ्य यह है कि आप इस सवाल से पूछते हैं, मुझे सलाह है कि आप पहिया – Jonathan

उत्तर

6

है ऐसा इसलिए है क्योंकि आप target-action पद्धति का उपयोग कर कोशिश कर रहे हैं लेकिन एक लक्ष्य गुजर नहीं। मैं वास्तव में प्रतिनिधि दृष्टिकोण की सिफारिश करता हूं लेकिन यहां एक उदाहरण है कि आपका इंटरफ़ेस कैसा दिखना चाहिए।

@interface HttpRequest : NSObject 
{ 
    @private 
    id onEndTarget; //<- need to know who to send the message to (do not retain) 
    SEL onEndSel; 
    NSMutableData* receivedData; 
} 

//Accept the target here 
-(void) StartRequest:(NSString *) url 
      parameters:(NSString*) params 
      onEndTarget:(id)target 
      onEndSelector:(SEL) selector; 

//... implementation 

-(void) connectionDidFinishLoading:(NSURLConnection*) connection 
{ 
    [onEndTarget performSelector:onEndSel withObject:[[NSMutableData alloc] initWithData:receivedData]]; 
} 

//... 
//Inside App Delegate 
[req StartRequest:url parameters:@"a" onEndTarget:self onEndSelector:@selector(OnFinishConn:)]; 

सुनिश्चित करें कि आप एंड ट्रेडमार्क पर नहीं रहें क्योंकि यह एक बनाए रखने चक्र बना सकता है। लक्ष्य को एक संपत्ति बनाने पर भी विचार करें ताकि कनेक्शन पूरा होने से पहले कुछ किया जा सके, तो यह प्रतिनिधि बनना बंद कर सकता है।

+0

पहिया को फिर से शुरू करने के बजाय ASIHttpRequest को आज़माएं, आपके सभी प्रतिक्रियाओं के लिए धन्यवाद। यह जो के कोड के साथ अच्छी तरह से काम किया। – Payn3

+0

खुशी है कि आपकी समस्या का समाधान हो जाने के बाद और स्टैक ओवरव्लो में आपका स्वागत है, उन्होंने एक प्रश्न को चिह्नित करने में मदद की है। – Joe

4

आप self को चयनकर्ता भेज रहे हैं, लेकिन वह HttpRequest में है। आप जिस चयनकर्ता को कॉल करने का प्रयास कर रहे हैं वह ऐपडिलेगेट में है। तो आप उस ऑब्जेक्ट को चयनकर्ता भेज रहे हैं जो इसे कार्यान्वित नहीं करता है। ठीक करने के लिए, आपको न केवल चयनकर्ता को स्टोर करना चाहिए, बल्कि ऑब्जेक्ट के लिए एक पॉइंटर जिसे चयनकर्ता भेजा जाना चाहिए।

1

कृपया NSInvocation पर दस्तावेजों को पढ़ने या एक पैरामीटर के रूप यदि आपका लक्ष्य ओएस समर्थन यह एक ब्लॉक गुजरती हैं।

+0

ब्रिललाइन्ट। यह जवाब होना चाहिए –

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