2011-08-16 5 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]); 
} 

私はObjective Cの中に新たなんだ、そうお待ちください。

+0

あなたの質問に答えることはできませんが、この質問をしているという事実は、ホイールを改革するのではなく、ASIHttpRequestを試すことをお勧めします。 – Jonathan

答えて

6

これは、target-actionパターンを使用していますが、ターゲットを渡していないためです。私は実際にデリゲートのアプローチをお勧めしますが、ここであなたのインターフェイスがどのように見えるべきかの例があります。

onEndTargetを保持しないようにしておくと、保持サイクルが作成される可能性があります。また、ターゲットをプロパティにすることを検討してください。完了する前に接続で何かが行われた場合、デリゲートとしての動作を停止することができます。

+0

ありがとうございました。 Joeのコードとうまくいった。 – Payn3

+0

彼らはあなたの問題が解決したらStackOverflowへようこそ! – Joe

4

セレクタをselfに送信していますが、これはHttpRequestにあります。呼び出すセレクタはAppDelegateにあります。したがって、セレクタを実装していないオブジェクトにセレクタを送ります。修正するには、セレクターだけでなく、セレクターを送信するオブジェクトへのポインターを格納する必要があります。

1

NSInvocationのドキュメントを読んだり、ターゲットOSがサポートしている場合は、ブロックとしてパラメータを渡してください。

+0

Brillliant。これが答えになるはずです –

関連する問題