协议的声明:

 //
// 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. 自适应瀑布型布局(手机,PC全兼容)

    有个瀑布型的布局需求,于是找了下,网上大部分用jquery控件,界面太复杂,看起来很笨重,我需求比较简单,于是只能自己写 其实原理就是用cs 去控制,那么我们只需要把对应的界面去规划就行了,比如,我一 ...

  2. 虚拟机创建及安装ELK

    虚拟机创建及安装ELK 作者:高波 归档:学习笔记 2018年5月31日 13:57:02 快捷键: Ctrl + 1    标题1 Ctrl + 2    标题2 Ctrl + 3    标题3 C ...

  3. iOS应用跳转到App Store评分

    iOS应用跳转到App Store评分 1.跳转到应用评价页 NSString *urlStr = [NSString stringWithFormat:@"itms-apps://itun ...

  4. easyui datagrid设置fit: true后,页面显示不全的情况

    跟工具栏有关 <div id="tb"> <div style="float:left;"> <a href="#&qu ...

  5. 【android】环形进度条实现

    先上效果图(压缩尺寸后出现锯齿,原图边缘很细腻的喂~) 特性: 1:支持环形带字 .环形不带字(中间盖上圆形图片,实现天天动听播放器在通知栏播放进度的效果).实心 2:线程安全,不需要写handler ...

  6. 很简单的在Ubuntu系统下安装字体和切换默认字体的方法

    摘要: Ubuntu系统安装好后,默认字体对于中文的支持看上去不太美丽,于是很多朋友可能需要设置系统的默认字体为自己喜欢的字体.本文主要介绍如何解决这两个问题. 说明:测试系统是Ubuntu14.04 ...

  7. Ubuntu中基于QT的系统网线连接状态的实时监视

    1.必要准备 需包: #include <QNetworkInterface> 2.实现获取当前的网线连接状态 以下是自己在网络上搜到的一个解决方法,且没有加入iface.flags(). ...

  8. 自然语言交流系统 phxnet团队 创新实训 个人博客 (三)

    因为需要处理自然语言的括号切分问题,专门记录下. import java.util.Scanner; import java.util.Stack; /** * @author Owner * */ ...

  9. 安装GYP(Generate Your Projects)

    GYP(Generate Your Projects)是由 Chromium 团队开发的跨平台自动化项目构建工具,Chromium 便是通过 GYP 进行项目构建管理. 主页 :http://code ...

  10. 计算机网络——链路层协议

    一. 链路层的功能 可靠交付:在高差错的链路,如无线链路,可以进行可靠交付:对于其它的有线,可以是多余的: 流量控制:防止接收方的缓存区溢出,帧丢失: 差错检测与差错纠正:在硬件上实现了: 二.多路访 ...