协议的声明:

 //
// 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 协议和运行时检查方法、类是否存在的更多相关文章

  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. OpenCV颜色空间——HLS颜色空间

    引自:http://blog.csdn.net/zhangping1987/article/details/73699335 HLS颜色模型 HLS颜色空间,三个分量分别是色相(H).亮度(L).饱和 ...

  2. Customize WCF Envelope and Namespace Prefix

    转自:http://vanacosmin.ro/Articles/Read/WCFEnvelopeNamespacePrefix Posted on January 8th 2014 by Vana ...

  3. 高大上的动态CSS

    项目里要添加 custom css 功能 (dynamic stylesheet ),总结一下实现方法. 1.在JSP中动态设定文件path 预先生成一些css文件,由用户选择,在jsp被请求时,动态 ...

  4. [技术选型] Node.js

    Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低.非常适合小型网站,个性化网站 NodeJS适合运用在高并发.I/O密集.少量 ...

  5. php 从1加到100

    <?php //1-100利用for循环1-100累加 $sum=0;//初始化sum值为0 for($i=1;$i<=100;$i++)//定义i,循环次数,一般求1-100的和,从1开 ...

  6. 关于Unity中的刚体和碰撞器的相关用法(一)

    1.创建一个3D工程 2.构造项目文件目录 3.保存场景为game_scene到文件夹scenes中 4.创建一个Plane平面类型的GameObject节点和一个Sphere球体类型的GameObj ...

  7. 7款开源ERP系统比较

    [网络转载] 现在有许多企业将ERP项目,在企 业中没有实施好,都归咎于软件产品不好.其实,这只是你们的借口.若想要将ERP软件真正与企业融合一体,首先得考虑企业的自身情况,再去选择适合的 ERP软件 ...

  8. C语言中的数组与字符串

    1. 数组与指针: 对于数组,需要注意两点:1, C语言中只有一维数组, 而且数组的大小必须在编译期就作为一个常数确定下来: 2. 对于一个数组,我们只能做两件事:确定数组的大小 和 获得指向该数组下 ...

  9. Mybatis系列(三):Mybatis实现关联表查询

    原文链接:http://www.cnblogs.com/xdp-gacl/p/4264440.html 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 ...

  10. Maven项目文档

    本教程学习如何一步到位地创建应用程序的文档.因此现在开始我们进入到  C:\MVN 创建 java 应用程序项目:consumerBanking. 进入到项目文件夹中执行以下命令 mvn 命令. C: ...