5

メソッドに引数があるクラスメソッドの記述に問題があります。

関数はクラス「SystemClass.m/h」内にあります

//JSON CALL
+(void)callLink:(NSString*)url toFunction:(SEL)method withVars:(NSMutableArray*)arguments {
    if([self checkConnection])
    {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSData *datas = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
            [arguments addObject:datas];
            [self performSelectorOnMainThread:@selector(method:) withObject:arguments waitUntilDone:YES];
        });
    }else{
        [self alertThis:@"There is no connection" with:nil];
    }
}

この関数は、JSON URLを呼び出し、メソッドにデータを提供します。

私はそれを次のように使用します:

[SystemClass callLink:@"http://www.mywebsite.com/call.php" toFunction:@selector(fetchedInfo:) withVars:nil];

しかし、次のようにクラッシュします。

キャッチされなかった例外'NSInvalidArgumentException'が原因でアプリを終了しています、理由:' + [SystemClassメソッド:]:認識されないセレクターがクラス0x92d50に送信されました'

手伝ってくれませんか。私はとにかく解決策を見つけようとしています!

ありがとう、アレックス

4

1 に答える 1

5

callLinkメソッドでは、既にセレクターを引数として指定しています(これは「メソッド」と呼ばれる引数です)。さらに、「method」引数はこのメソッドを実装するオブジェクトから呼び出す必要があるため、もう1つの引数を追加する必要があります(この例では、アプリケーションは、次の場合にSystemClassから「method」という名前のメソッドを呼び出そうとします。電話 :

[self performSelectorOnMainThread:method withObject:arguments waitUntilDone:YES];

ここで、selfはSystemClassであり、そのようなメソッドはSystemClassに存在しないようです。そのため、クラッシュしています)。したがって、引数にターゲット(idオブジェクト)を追加します。

+(void)callLink:(NSString*)url forTarget:(id) target toFunction:(SEL)method withVars:(NSMutableArray*)arguments;

したがって、次の行では、セレクターを指定して、ターゲットオブジェクトでこのセレクターを呼び出す必要があります。

[target performSelectorOnMainThread:method withObject:arguments waitUntilDone:YES];

そしてではない:

[self performSelectorOnMainThread:@selector(method:) withObject:arguments waitUntilDone:YES];

改善 :

セレクターを呼び出す前に、ターゲットがそのようなことを行うセレクターに応答するかどうかを確認する必要があります(アプリケーションがクラッシュするのを防ぎます)。これを行う代わりに:

[target performSelectorOnMainThread:method withObject:arguments waitUntilDone:YES];

これを行う :

if([target respondsToSelector:method])
{
  [target performSelectorOnMainThread:method withObject:arguments waitUntilDone:YES];
}
else
{
  //The target do not respond to method so you can inform the user, or call a NSLog()...
}
于 2012-10-25T12:06:35.097 に答える