协议的声明:

  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. IDEA调试总结(设置断点进行调试)

    IDEA调试总结(设置断点进行调试) 黑背景版: 先编译好要调试的程序.1.设置断点

  2. phpcms v9 所有当前栏目信息标签

    PHPCMS v9 很多时候在内容页下不关是调用内容页的信息,还会调用当前栏目的相关信息.下面做总结,方便大家找到在内容页想调用的东西当前栏目id:                       {$c ...

  3. jQuery(三):样式操作

    一.DOM操作分类 DOM Core:任何一种支持DOM的编程语言都可以使用它,例如:getElementById(). HTML-DOM:用于处理HTML文档,例如:document.forms. ...

  4. node学习笔记1——配置node环境变量及执行node文件

    最近在学习node,今天说一下node的变量环境配置.虽然网上有说,最新版的已经不需要配置这个东东了,但是我的电脑还是得配置.闲话少扯,进入正题: 1.安装node,这步就略过了.就是下载 node, ...

  5. WinForm中播放视频示例(含源码)

    1背景 这几天一老友要求我做个小软件,在WinForm播放视频.印象中微软有个WM控件直接可以使用,晚上研究下 2实现方式 2.1微软草根 最简单的方式,是直接使用微软的WM控件,也是通过COM方式集 ...

  6. 关于Unity中3D声音的使用

    3D声音 3D立体声和2D声不同的地方是它是会随着距离衰减的,距离越近声音越大,距离越远声音越小. 1: 声音: 背景音乐和音效; 2: 声音文件支持的格式: ogg, mp3, wave, AIFF ...

  7. 对 /etc/rc.d/init.d 目录的一点理解

    转载 一.Linux的引导过程 系统启动之后,在进入init.d之前,我们先来看看系统都做了什么工作.系统加电之后,首先进行的硬件自检,然后是bootload对系统的初始化,加载内核. 内核被加载到内 ...

  8. oc总结 --oc基础语法相关知识

    m是OC源文件扩展名,入口点也是main函数,第一个OC程序: #import <Foundation/Foundation.h> int main(int argc, const cha ...

  9. CI框架 -- 核心文件 之 Model.php

    class CI_Model { /** * Class constructor * * @return void */ public function __construct() { log_mes ...

  10. svn -- svn简介

    一.为什么需要SVN 你们在做中级项目中,都是采用小组合作开发的?那么说说你们在后期整合中遇到问题? 主要应用于: 1.协作开发 2.远程协作 3.版本回退 二.什么是SVN l svn全称SubVe ...