Objective-C 协议和运行时检查方法、类是否存在
协议的声明:
- //
- // Person.h
- // TestOC01
- //
- // Created by xinye on 13-10-23.
- // Copyright (c) 2013年 xinye. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- @protocol Person <NSObject>
- @property (nonatomic,strong) NSString *firstName;
- @property (nonatomic,strong) NSString *lastName;
- @property (nonatomic,unsafe_unretained) NSUInteger age;
- @optional
- -(id<Person>) initWithFirstName:(NSString *) firstName
- lastName:(NSString *) lastName
- age:(NSUInteger) age;
- @required
- -(id<Person>) initWithNil;
- @end
实现协议:
- //
- // Father.h
- // TestOC01
- //
- // Created by xinye on 13-10-23.
- // Copyright (c) 2013年 xinye. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- #import "Person.h"
- @interface Father : NSObject <Person>
- +(void) sayNil;
- @end
- //
- // Father.m
- // TestOC01
- //
- // Created by xinye on 13-10-23.
- // Copyright (c) 2013年 xinye. All rights reserved.
- //
- #import "Father.h"
- @implementation Father
- // 实现一个协议,必须实现其@required标记的方法,并且必须@synthesize协议中定义的@requeired属性,协议中定义的方法和属性默认都是@required的
- @synthesize firstName,lastName,age;
- -(id<Person>) initWithFirstName:(NSString *)_firstName lastName:(NSString *)_lastName age:(NSUInteger)_age
- {
- self = [super init];
- if (self) {
- self.firstName = _firstName;
- self.lastName = _lastName;
- self.age = _age;
- }
- return self;
- }
- -(id<Person>) initWithNil
- {
- self = [super init];
- return self;
- }
- +(void) sayNil
- {
- NSLog(@"say Nil Method");
- }
- @end
测试:
- //
- // main.m
- // TestOC01
- //
- // Created by xinye on 13-10-23.
- // Copyright (c) 2013年 xinye. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- #import "Person.h"
- #import "Father.h"
- int main(int argc, const char * argv[])
- {
- @autoreleasepool {
- id<Person> per = [[Father alloc]initWithFirstName:@"张" lastName:@"三" age:];
- NSLog(@"姓名:%@",[[per firstName] stringByAppendingString:per.lastName]);
- NSLog(@"年龄:%li",per.age);
- // 检测是否有实例方法
- if([Father instancesRespondToSelector:@selector(initWithNil)]){
- NSLog(@"*****Father 类中有一个实例方法:initWithNil");
- }else{
- NSLog(@"Father 类中没有initWithNil实例方法");
- }
- // 检测是否有类方法
- if([Father respondsToSelector:@selector(sayNil)]){
- NSLog(@"*****Father 类中有sayNil类方法");
- }else{
- NSLog(@"Father 类中没有sayNil类方法");
- }
- // 检测是否有实例方法
- if([per respondsToSelector:@selector(initWithFirstName:lastName:age:)]){
- NSLog(@"*****Father 类中有initWithFirstName:lastName:age:实例方法");
- }else{
- NSLog(@"Father 类中没有initWithFirstName:lastName:age:实例方法");
- }
- // 检测指定的类是否存在
- if(NSClassFromString(@"NSString") != nil){
- NSLog(@"=========当前版本中存在NSString类");
- }else{
- NSLog(@"$$$$$$$$$当前版本中不存在NSString类");
- }
- if(NSClassFromString(@"NBString") != nil){
- NSLog(@"=========当前版本中存在NBString类");
- }else{
- NSLog(@"$$$$$$$$$当前版本中不存在NBString类");
- }
- }
- return ;
- }
Objective-C 协议和运行时检查方法、类是否存在的更多相关文章
- [源码解析] PyTorch 流水线并行实现 (3)--切分数据和运行时系统
[源码解析] PyTorch 流水线并行实现 (3)--切分数据和运行时系统 目录 [源码解析] PyTorch 流水线并行实现 (3)--切分数据和运行时系统 0x00 摘要 0x01 分割小批次 ...
- 深入理解OOP(三):多态和继承(动态绑定和运行时多态)
在前面的文章中,我们介绍了编译期多态.params关键字.实例化.base关键字等.本节我们来关注另外一种多态:运行时多态, 运行时多态也叫迟绑定. 深入理解OOP(一):多态和继承(初期绑定和编译时 ...
- [转] Java 的泛型擦除和运行时泛型信息获取
原文链接 https://my.oschina.net/lifany/blog/875769 前言 现在很多程序员都会在简历中写上精通 Java.但究竟怎样才算是精通 Java 呢?我觉得不仅要熟练掌 ...
- Java虚拟机系列一:一文搞懂 JVM 架构和运行时数据区
前言 之前写博客一直比较随性,主题也很随意,就是想到什么写什么,对什么感兴趣就写什么.虽然写起来无拘无束,自在随意,但也带来了一些问题,每次写完一篇后就要去纠结下一篇到底写什么,看来选择太多也不是好事 ...
- 排错-windows下 ORA-12560 TNS 协议适配器错误解决方法
排错-windows下_ORA-12560 TNS 协议适配器错误解决方法 by:授客 QQ:1033553122 问题描述: 修改SQL*Plus窗口属性后,重新打开SQL*Plus时出现ORA-1 ...
- DataTable和DataRow利用反射直接转换为Model对象的扩展方法类
DataTable和DataRow利用反射直接转换为Model对象的扩展方法类 /// <summary> /// 类 说 明:给DataTable和DataRow扩展方法,直接转换为 ...
- Objective-C面向对象-对象和类
文章都是先由本人个人博客:孙占兴:www.teilim.com,先更新,随后CSDN博客才会更新,掌握第一动态请关注本人主站. 原文链接:http://www.teilim.com/objective ...
- Java编译时常量和运行时常量
Java编译时常量和运行时常量 编译期常量指的就是程序在编译时就能确定这个常量的具体值. 非编译期常量就是程序在运行时才能确定常量的值,因此也称为运行时常量. 在Java中,编译期常量指的是用fina ...
- day20-Python运维开发基础(装饰器 / 类中的方法 / 类的方法变属性)
1. 装饰器 / 类中的方法 / 类的方法变属性 # ### 装饰器 """ 定义:装饰器用于拓展原来函数功能的一种语法,返回新函数替换旧函数 优点:在不更改原函数代码的 ...
随机推荐
- Java编程的逻辑 (60) - 随机读写文件及其应用 - 实现一个简单的KV数据库
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- Sql Over的用法
转载自:http://www.cnblogs.com/lanzi/archive/2010/10/26/1861338.html OVER(PARTITION BY)函数介绍 开窗函数 Oracle从 ...
- hbase1.4.0安装和使用
jia下载地址: http://mirrors.shuosc.org/apache/hbase/1.4.0/ 解压 tar -zxvf hbase-1.4.0-bin.tar.gz 修改环境变量 [ ...
- Android训练课程(Android Training) - 使用Volley传输网络数据(Transmitting Network Data Using Volley)
使用Volley传输网络数据(Transmitting Network Data Using Volley) Volley 是一个 HTTP 库,它使得在Android应用程序中操作网络更容易,是重要 ...
- Intel edison 智能硬件开发指南 基于YoctoProject
首先简单的介绍一下edison的板子: edison 芯片 22nm工艺,quark双核SoC,采用atom架构,针对小型智能设备 X86架构 相当于一台“奔腾级电脑” 低功耗,小体积,自带wifi ...
- USB学习笔记连载(十五):USB固件更新以及安装驱动
前几篇博客已经把如何更改固件程序和更改USB驱动名称,那么接下来就要把之前生成的 .iic 文件烧录到EEPROM里面去,实现USB的C2启动(笔者使用的是此类型,C2启动). 打开Cypress U ...
- numpy reshape resize用法
https://docs.scipy.org/doc/numpy/reference/generated/numpy.resize.html a = np.zeros((100,28*28)) pri ...
- unity--------------------四元数的旋转与原理
[Unity技巧]四元数(Quaternion)和旋转 原文:http://blog.csdn.net/candycat1992/article/details/41254799 四元数介绍 旋转,应 ...
- nodejs基础 -- 路由
我们要为路由提供请求的URL和其他需要的GET/POST参数,随后路由需要根据这些数据(URL.GET/POST参数)来执行相应的代码. 因此,需要查看HTTP请求,从中提取出请求的URL及GET/P ...
- Ubuntu+Eclipse+SVN 版本控制配置笔记
第一步:先更新系统内部软件包缓存(预防出错) # sudo dpkg --clear-avail # sudo apt-get update 第二步:安装Eclipse的SVN接口组件“javaH ...