第一:NSobject 类的方法。
isKindOfClass|isMemberOfClass|conformsToProtocol|respondsToSelector|
methodForSelector等方法都是NSobject类的方法。这些有的是我们常用的、有的也是我们不用的。所以,在一些面试的试题或者口答的时候都会涉到它们的作用和部分之间的区别。
第二:相关代码。
1.主要模块
// ViewController.m
// KindClass_Metoh
//
// Created by 周双建 on 16/4/7.
// Copyright © 2016年周双建. All rights reserved.
//
#import "ViewController.h"
#import "MyStr.h"
#import "KProtocol.h"
@interface ViewController ()<MyDelegate>
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
NSString * Str = @"成功QQ吧";
NSString * Str1 = @"成功QQ吧";
/*
* - (BOOL)isEqualToString:(NSString *)aString NSString类的方法
* - (BOOL)isEqual:(id)object NSObject类的方法
* 用于判断一个字符串的实例是否和给定的实例相等,相等返回 YES,否则,返回 NO
*/
if ([Str isEqualToString:@"QQ"]) {
}
if ([Str isEqual:Str1]) {
}
/*
* - (BOOL)isKindOfClass:(Class)aClass NSObject类的方法
* 用于判断一个实例对象是否是某一个类或者类的继承,是返回 YES,否则,返回 NO
*/
if ([Str isKindOfClass:[NSStringclass]]) {
}
/*******************************************************************/
/*
* - (BOOL)isMemberOfClass:(Class)aClass;
* 用于判断一个实例对象是否是某一个类,是返回 YES,否则,返回 NO
*/
MyStr * Temp_Str = [[MyStralloc]init];
if ([Temp_Str isKindOfClass:[NSString class]]) {
NSLog(@"Temp_Str是NSString类的对象实例");
}
if ([Temp_Str isKindOfClass:[MyStr class]]) {
NSLog(@"Temp_Str是MyStr类的对象实例");
}
if ([Temp_Str isMemberOfClass:[NSString class]]) {
NSLog(@"Temp_Str不是NSString类");
}
if ([Temp_Str isMemberOfClass:[MyStr class]]) {
NSLog(@"Temp_Str是MyStr类");
}
/*
isKindOfClass | isMemberOfClass 的官方定义
@: isKindOfClass
Returns a Boolean value that indicates whether the receiver is an instance of given class or an instance of any class that inherits from that class.
(返回一个布尔值,指示是否接收给定类或其他类继承的类的实例的实例。)
@: isMemberOfClass
Returns a Boolean value that indicates whether the receiver is an instance of a given class.
(返回一个布尔值,指示是否接收某个类的一个实例。)
*/
/*
isKindOfClass | isMemberOfClass 的区别
1. isKindOfClass 可以用于判断一个类的实例对象是否属于父类还是父类的继承类。
2. isMemberOfClass 只可以判断一个类的实例对象是否该类的对象,不可判断对象是否是该类的父类的对象。
*/
/*******************************************************************/
/*
* - (BOOL)conformsToProtocol:(Protocol *)aProtocol
* 用于检验一个类是否符合某个协议
*/
KProtocol * Pl = [[KProtocolalloc]init];
if ([PlconformsToProtocol:@protocol(MyDelegate)]) {
NSLog(@"PL对象符合 MyDelete协议");
}
if ([selfconformsToProtocol:@protocol(MyDelegate)]) {
NSLog(@"Self对象符合 MyDelete协议");
}
/*******************************************************************/
/*
* - (BOOL)respondsToSelector:(SEL)aSelector | + (BOOL)instancesRespondToSelector:(SEL)aSelector
* 用于检测某个类相应的方法是否实现(该方法可以不声明)
*/
if ([selfrespondsToSelector:@selector(test)]) {
NSLog(@"Self对象有 test方法的实现");
}
if ([selfrespondsToSelector:@selector(eat)]) {
NSLog(@"Self对象有 eat方法的实现");
}
if ([KProtocolinstancesRespondToSelector:@selector(mytest)]) {
NSLog(@"KProtocol对象有 mytest方法的实现");
}
[self test];
/*******************************************************************/
/*
* - (IMP)methodForSelector:(SEL)aSelector;
* 这个方法可以根据一个SEL,得到该方法的IMP(函数指针)
*/
/*
1. SEL
Objective-C是动态语言,动态体现在可以在运行的时候修改所执行的方法,可以把一个对象的所有方法看成一张表,SEL就可以看成表中每一条的索引,根据方法名来生成对应的SEL,所以OC中不同的方法名就对应不同的方法
2. IMP
IMP是真正的函数指针,这是其定义
typedef id (*IMP)(id, SEL,... );
它指向一个真正的函数地址
*/
// 获取一个函数指针
IMP ZSJ_IMP = [selfmethodForSelector:@selector(SelSelecd)];
// 我们就可以通过函数指针,直接调用方法
ZSJ_IMP(); // 与 [self SelSelecd] 相比似乎高大上了许多
}
-(void)test{
// [self doesNotRecognizeSelector:_cmd];
NSLog(@"成功QQ吧");
}
-(void)SelSelecd{
NSLog(@"成功QQ吧-函数指针");
}
- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
// Protocol.h
// KindClass_Metoh
//
// Created by 周双建 on 16/4/7.
// Copyright © 2016年周双建. All rights reserved.
//
#import <Foundation/Foundation.h>
// create one Protocol
@protocol MyDelegate <NSObject>
@required
-(void)mustcreate;
// 可以实现或者不实现的方法
@optional
-(void)create;
@end
@interface KProtocol : NSObject
-(void)mytest;
@end
//
// Protocol.m
// KindClass_Metoh
//
// Created by 周双建 on 16/4/7.
// Copyright © 2016年周双建. All rights reserved.
//
#import "KProtocol.h"
@implementation KProtocol
-(void)mytest{
}
@end
//
// MyStr.h
// KindClass_Metoh
//
// Created by 周双建 on 16/4/7.
// Copyright © 2016年周双建. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface MyStr : NSString
@end
//
// MyStr.m
// KindClass_Metoh
//
// Created by 周双建 on 16/4/7.
// Copyright © 2016年周双建. All rights reserved.
//
#import "MyStr.h"
@implementation MyStr
@end