协议的声明:

  1. //
  2. // Person.h
  3. // TestOC01
  4. //
  5. // Created by xinye on 13-10-23.
  6. // Copyright (c) 2013年 xinye. All rights reserved.
  7. //
  8.  
  9. #import <Foundation/Foundation.h>
  10.  
  11. @protocol Person <NSObject>
  12.  
  13. @property (nonatomic,strong) NSString *firstName;
  14. @property (nonatomic,strong) NSString *lastName;
  15. @property (nonatomic,unsafe_unretained) NSUInteger age;
  16.  
  17. @optional
  18. -(id<Person>) initWithFirstName:(NSString *) firstName
  19. lastName:(NSString *) lastName
  20. age:(NSUInteger) age;
  21. @required
  22. -(id<Person>) initWithNil;
  23. @end

实现协议:

  1. //
  2. // Father.h
  3. // TestOC01
  4. //
  5. // Created by xinye on 13-10-23.
  6. // Copyright (c) 2013年 xinye. All rights reserved.
  7. //
  8.  
  9. #import <Foundation/Foundation.h>
  10. #import "Person.h"
  11.  
  12. @interface Father : NSObject <Person>
  13.  
  14. +(void) sayNil;
  15.  
  16. @end
  17.  
  18. //
  19. // Father.m
  20. // TestOC01
  21. //
  22. // Created by xinye on 13-10-23.
  23. // Copyright (c) 2013年 xinye. All rights reserved.
  24. //
  25.  
  26. #import "Father.h"
  27.  
  28. @implementation Father
  29. // 实现一个协议,必须实现其@required标记的方法,并且必须@synthesize协议中定义的@requeired属性,协议中定义的方法和属性默认都是@required的
  30. @synthesize firstName,lastName,age;
  31.  
  32. -(id<Person>) initWithFirstName:(NSString *)_firstName lastName:(NSString *)_lastName age:(NSUInteger)_age
  33. {
  34. self = [super init];
  35. if (self) {
  36. self.firstName = _firstName;
  37. self.lastName = _lastName;
  38. self.age = _age;
  39. }
  40.  
  41. return self;
  42. }
  43.  
  44. -(id<Person>) initWithNil
  45. {
  46. self = [super init];
  47. return self;
  48. }
  49.  
  50. +(void) sayNil
  51. {
  52. NSLog(@"say Nil Method");
  53. }
  54. @end

测试:

  1. //
  2. // main.m
  3. // TestOC01
  4. //
  5. // Created by xinye on 13-10-23.
  6. // Copyright (c) 2013年 xinye. All rights reserved.
  7. //
  8.  
  9. #import <Foundation/Foundation.h>
  10. #import "Person.h"
  11. #import "Father.h"
  12.  
  13. int main(int argc, const char * argv[])
  14. {
  15.  
  16. @autoreleasepool {
  17.  
  18. id<Person> per = [[Father alloc]initWithFirstName:@"张" lastName:@"三" age:];
  19.  
  20. NSLog(@"姓名:%@",[[per firstName] stringByAppendingString:per.lastName]);
  21. NSLog(@"年龄:%li",per.age);
  22. // 检测是否有实例方法
  23. if([Father instancesRespondToSelector:@selector(initWithNil)]){
  24. NSLog(@"*****Father 类中有一个实例方法:initWithNil");
  25. }else{
  26. NSLog(@"Father 类中没有initWithNil实例方法");
  27. }
  28.  
  29. // 检测是否有类方法
  30. if([Father respondsToSelector:@selector(sayNil)]){
  31. NSLog(@"*****Father 类中有sayNil类方法");
  32. }else{
  33. NSLog(@"Father 类中没有sayNil类方法");
  34. }
  35.  
  36. // 检测是否有实例方法
  37. if([per respondsToSelector:@selector(initWithFirstName:lastName:age:)]){
  38. NSLog(@"*****Father 类中有initWithFirstName:lastName:age:实例方法");
  39. }else{
  40. NSLog(@"Father 类中没有initWithFirstName:lastName:age:实例方法");
  41. }
  42.  
  43. // 检测指定的类是否存在
  44. if(NSClassFromString(@"NSString") != nil){
  45. NSLog(@"=========当前版本中存在NSString类");
  46. }else{
  47. NSLog(@"$$$$$$$$$当前版本中不存在NSString类");
  48. }
  49. if(NSClassFromString(@"NBString") != nil){
  50. NSLog(@"=========当前版本中存在NBString类");
  51. }else{
  52. NSLog(@"$$$$$$$$$当前版本中不存在NBString类");
  53. }
  54.  
  55. }
  56. return ;
  57. }

Objective-C 协议和运行时检查方法、类是否存在的更多相关文章

  1. [源码解析] PyTorch 流水线并行实现 (3)--切分数据和运行时系统

    [源码解析] PyTorch 流水线并行实现 (3)--切分数据和运行时系统 目录 [源码解析] PyTorch 流水线并行实现 (3)--切分数据和运行时系统 0x00 摘要 0x01 分割小批次 ...

  2. 深入理解OOP(三):多态和继承(动态绑定和运行时多态)

    在前面的文章中,我们介绍了编译期多态.params关键字.实例化.base关键字等.本节我们来关注另外一种多态:运行时多态, 运行时多态也叫迟绑定. 深入理解OOP(一):多态和继承(初期绑定和编译时 ...

  3. [转] Java 的泛型擦除和运行时泛型信息获取

    原文链接 https://my.oschina.net/lifany/blog/875769 前言 现在很多程序员都会在简历中写上精通 Java.但究竟怎样才算是精通 Java 呢?我觉得不仅要熟练掌 ...

  4. Java虚拟机系列一:一文搞懂 JVM 架构和运行时数据区

    前言 之前写博客一直比较随性,主题也很随意,就是想到什么写什么,对什么感兴趣就写什么.虽然写起来无拘无束,自在随意,但也带来了一些问题,每次写完一篇后就要去纠结下一篇到底写什么,看来选择太多也不是好事 ...

  5. 排错-windows下 ORA-12560 TNS 协议适配器错误解决方法

    排错-windows下_ORA-12560 TNS 协议适配器错误解决方法 by:授客 QQ:1033553122 问题描述: 修改SQL*Plus窗口属性后,重新打开SQL*Plus时出现ORA-1 ...

  6. DataTable和DataRow利用反射直接转换为Model对象的扩展方法类

    DataTable和DataRow利用反射直接转换为Model对象的扩展方法类   /// <summary> /// 类 说 明:给DataTable和DataRow扩展方法,直接转换为 ...

  7. Objective-C面向对象-对象和类

    文章都是先由本人个人博客:孙占兴:www.teilim.com,先更新,随后CSDN博客才会更新,掌握第一动态请关注本人主站. 原文链接:http://www.teilim.com/objective ...

  8. Java编译时常量和运行时常量

    Java编译时常量和运行时常量 编译期常量指的就是程序在编译时就能确定这个常量的具体值. 非编译期常量就是程序在运行时才能确定常量的值,因此也称为运行时常量. 在Java中,编译期常量指的是用fina ...

  9. day20-Python运维开发基础(装饰器 / 类中的方法 / 类的方法变属性)

    1. 装饰器 / 类中的方法 / 类的方法变属性 # ### 装饰器 """ 定义:装饰器用于拓展原来函数功能的一种语法,返回新函数替换旧函数 优点:在不更改原函数代码的 ...

随机推荐

  1. Java编程的逻辑 (60) - 随机读写文件及其应用 - 实现一个简单的KV数据库

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  2. Sql Over的用法

    转载自:http://www.cnblogs.com/lanzi/archive/2010/10/26/1861338.html OVER(PARTITION BY)函数介绍 开窗函数 Oracle从 ...

  3. hbase1.4.0安装和使用

    jia下载地址:  http://mirrors.shuosc.org/apache/hbase/1.4.0/ 解压 tar -zxvf hbase-1.4.0-bin.tar.gz 修改环境变量 [ ...

  4. Android训练课程(Android Training) - 使用Volley传输网络数据(Transmitting Network Data Using Volley)

    使用Volley传输网络数据(Transmitting Network Data Using Volley) Volley 是一个 HTTP 库,它使得在Android应用程序中操作网络更容易,是重要 ...

  5. Intel edison 智能硬件开发指南 基于YoctoProject

    首先简单的介绍一下edison的板子: edison 芯片 22nm工艺,quark双核SoC,采用atom架构,针对小型智能设备  X86架构 相当于一台“奔腾级电脑” 低功耗,小体积,自带wifi ...

  6. USB学习笔记连载(十五):USB固件更新以及安装驱动

    前几篇博客已经把如何更改固件程序和更改USB驱动名称,那么接下来就要把之前生成的 .iic 文件烧录到EEPROM里面去,实现USB的C2启动(笔者使用的是此类型,C2启动). 打开Cypress U ...

  7. numpy reshape resize用法

    https://docs.scipy.org/doc/numpy/reference/generated/numpy.resize.html a = np.zeros((100,28*28)) pri ...

  8. unity--------------------四元数的旋转与原理

    [Unity技巧]四元数(Quaternion)和旋转 原文:http://blog.csdn.net/candycat1992/article/details/41254799 四元数介绍 旋转,应 ...

  9. nodejs基础 -- 路由

    我们要为路由提供请求的URL和其他需要的GET/POST参数,随后路由需要根据这些数据(URL.GET/POST参数)来执行相应的代码. 因此,需要查看HTTP请求,从中提取出请求的URL及GET/P ...

  10. Ubuntu+Eclipse+SVN 版本控制配置笔记

    第一步:先更新系统内部软件包缓存(预防出错) #  sudo dpkg --clear-avail #  sudo apt-get update 第二步:安装Eclipse的SVN接口组件“javaH ...