isKindOfClass|isMemberOfClass|conformsToProtocol|respondsToSelector|methodForSelector的详细介绍和区别

第一: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_StrNSString类的对象实例");

    }

    if ([Temp_Str isKindOfClass:[MyStr class]]) {

        NSLog(@"Temp_StrMyStr类的对象实例");

    }

    if ([Temp_Str isMemberOfClass:[NSString class]]) {

        NSLog(@"Temp_Str不是NSString");

    }

    if ([Temp_Str isMemberOfClass:[MyStr class]]) {

        NSLog(@"Temp_StrMyStr");

    }

    /*

       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


2.辅助模块一(一个类)

//  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


3、辅助模块二(一个继承类)

//

//  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




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值