2011-08-16 2 views
5

매개 변수로 선택기를 전달하고 나중에 실행하려고합니다. 응용 프로그램을 종료Objective-C : 매개 변수로 선택기를 전달한 다음 호출하십시오.

인해 캐치되지 않는 예외 'NSInvalidArgumentException', 이유에 : 내가 콘솔에서 다음 오류 선택기를 호출 할 때하지만 난이 SIGABRT 오류가 '- [HttpRequest를 OnFinishConn :] : 인식 할 수없는 선택

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

인스턴스 0x7834c80 '로 전송
#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]); 
} 

내가 객관적 C의 새로운, 그래서 기다려주십시오.

+0

귀하의 질문에 대한 답변이 아니지만 귀하가이 질문을하는 것이 사실이라면 바퀴를 다시 열지 말고 ASIHttpRequest를 사용해 보는 것이 좋습니다. – 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:)]; 

유지주기가 생길 수 있으므로 onEndTarget을 유지하지 마십시오. 또한 대상을 속성으로 만드는 것을 고려해보십시오. 완료되기 전에 무언가가 연결로 완료되면 대리자가 될 수 없습니다.

+0

답장을 보내 주셔서 감사합니다. Joe의 코드와 잘 작동했습니다. – Payn3

+0

다행 그들은 문제가 해결되면 StackOverflow에 오신 것을 환영합니다 답변으로 질문을 표시하는 데 도움이!. – Joe

4

선택기를 self으로 보내고 있지만 HttpRequest에 있습니다. 호출하려는 선택기는 AppDelegate에 있습니다. 따라서 선택기를 구현하지 않는 객체에 선택기를 보냅니다. 문제를 해결하려면 선택기뿐만 아니라 선택기를 보내야하는 객체에 대한 포인터를 저장해야합니다.

1

NSInvocation에서 문서를 읽거나 대상 OS에서 지원하는 경우 블록을 매개 변수로 전달하십시오.

+0

Brillliant. 이것은 답변이되어야합니다. –

관련 문제