0

メソッドを使用するとき、respondsToSelector:またはinstancesRespondToSelector:43 行目で STAssertTrue をバイパスできないのはなぜですか?

//私のテストケースコード

- (void)testApiClass {
    //Check object
    NSString* classKey = @"Api";
    id obj = NSClassFromString(classKey);
    STAssertNotNil(obj, [NSString stringWithFormat:@"Model '%@' not found.", classKey]);
    //Check properties
    NSArray* properties =
    @[
        @"performSyncRequestWithUri::",
        @"performAsyncRequestWithUri:::",
    ];
    for (NSString* property in properties) {
        SEL propertySel = NSSelectorFromString(property);
        BOOL isRespondsToSel = [obj respondsToSelector:propertySel];
        STAssertTrue(isRespondsToSel, [NSString stringWithFormat:@"Property '%@' not found on object of class name '%@'", property, [obj class]]);
    }    
}


@interface Api : NSObject

- (NSDictionary*)performSyncRequestWithUri:(NSString *)requestUri params:(NSDictionary *)params;
- (void)performAsyncRequestWithUri:(NSString *)requestUri params:(NSDictionary *)params completionHandler:(void (^)(NSDictionary *, NSError *))completionBlock;

@end
4

2 に答える 2

2

配列の文字列定数がインターフェイスpropertiesのセレクターと一致しません。Api

また、これらのセレクターはどちらもプロパティを参照しません。プロパティには 2 つのセレクターがあります。コロンのない getter のようなと、コロンが 1 つあり (通常は) で始まるstringValuesetter のようなです。setStringValue:set

セレクターを文字列に埋め込む代わりに、セレクターの配列を作成します。

SEL selectors[] = {
    @selector(performSyncRequestWithUri:params:),
    @selector(performAsyncRequestWithUri:params:completionHandler:),
    NULL
};

for (size_t i = 0; selectors[i]; ++i) {
    SEL selector = selectors[i];
    BOOL respondsToSelector = [obj respondsToSelector:selector];
    STAssertTrue(respondsToSelector, [NSString stringWithFormat:
        @"Object %@ doesn't respond to selector %s",
        obj, sel_getName(selector)]);
}

ここでの利点は、Xcode がセレクターをオートコンプリートし、セレクターをコマンドクリックしてその定義にジャンプできることです。

于 2012-12-21T20:32:02.660 に答える
1

メソッドが呼び出されperformAsyncRequestWithUri:params:completionHandler:performSyncRequestWithUri:params:

于 2012-12-21T19:25:22.307 に答える