_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
文字列からメソッドを呼ぶ
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
NSString *selectorName = @"xxxxx";
SEL selector = NSSelectorFromString(selectorName);
[self performSelector:selector];
#pragma clang diagnostic pop
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
メソッド有無チェック
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
SEL selector = NSSelectorFromString(@"aaa:");
if ([UIView instancesRespondToSelector:selector]) {
[UIView performSelector:selector];
}
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
メソッド有無チェック関数の違い
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
@interface NSObject
- (BOOL)respondsToSelector:(SEL)aSelector;
@end
@interface NSObject
+ (BOOL)instancesRespondToSelector:(SEL)aSelector;
@end
例)
#import <Foundation/Foundation.h>
int main(void) {
@autoreleasepool {
NSLog(@"-respondsToSelector: Class Method : %@", @([[NSObject class] respondsToSelector:@selector(new)]));
NSLog(@"-respondsToSelector: Instance Method : %@", @([[NSObject new] respondsToSelector:@selector(description)]));
NSLog(@"+instancesRespondToSelector: Class Method : %@", @([NSObject instancesRespondToSelector:@selector(new)]));
NSLog(@"+instancesRespondToSelector: Instance Method : %@", @([NSObject instancesRespondToSelector:@selector(description)]));
}
return 0;
}
ログ)
-respondsToSelector: Class Method : 1
-respondsToSelector: Instance Method : 1
+instancesRespondToSelector: Class Method : 0
+instancesRespondToSelector: Instance Method : 1
まとめ)
クラスメソッドの存在もインスタンスメソッドの存在も respondsToSelector: で確認出来る。
そのセレクタを渡すレシーバに、インスタンスを渡すか Class を渡すかで切り替えられる。
最終更新:2016年03月25日 09:22