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. 装饰器 / 类中的方法 / 类的方法变属性 # ### 装饰器 """ 定义:装饰器用于拓展原来函数功能的一种语法,返回新函数替换旧函数 优点:在不更改原函数代码的 ...
随机推荐
- IDEA调试总结(设置断点进行调试)
IDEA调试总结(设置断点进行调试) 黑背景版: 先编译好要调试的程序.1.设置断点
- phpcms v9 所有当前栏目信息标签
PHPCMS v9 很多时候在内容页下不关是调用内容页的信息,还会调用当前栏目的相关信息.下面做总结,方便大家找到在内容页想调用的东西当前栏目id: {$c ...
- jQuery(三):样式操作
一.DOM操作分类 DOM Core:任何一种支持DOM的编程语言都可以使用它,例如:getElementById(). HTML-DOM:用于处理HTML文档,例如:document.forms. ...
- node学习笔记1——配置node环境变量及执行node文件
最近在学习node,今天说一下node的变量环境配置.虽然网上有说,最新版的已经不需要配置这个东东了,但是我的电脑还是得配置.闲话少扯,进入正题: 1.安装node,这步就略过了.就是下载 node, ...
- WinForm中播放视频示例(含源码)
1背景 这几天一老友要求我做个小软件,在WinForm播放视频.印象中微软有个WM控件直接可以使用,晚上研究下 2实现方式 2.1微软草根 最简单的方式,是直接使用微软的WM控件,也是通过COM方式集 ...
- 关于Unity中3D声音的使用
3D声音 3D立体声和2D声不同的地方是它是会随着距离衰减的,距离越近声音越大,距离越远声音越小. 1: 声音: 背景音乐和音效; 2: 声音文件支持的格式: ogg, mp3, wave, AIFF ...
- 对 /etc/rc.d/init.d 目录的一点理解
转载 一.Linux的引导过程 系统启动之后,在进入init.d之前,我们先来看看系统都做了什么工作.系统加电之后,首先进行的硬件自检,然后是bootload对系统的初始化,加载内核. 内核被加载到内 ...
- oc总结 --oc基础语法相关知识
m是OC源文件扩展名,入口点也是main函数,第一个OC程序: #import <Foundation/Foundation.h> int main(int argc, const cha ...
- CI框架 -- 核心文件 之 Model.php
class CI_Model { /** * Class constructor * * @return void */ public function __construct() { log_mes ...
- svn -- svn简介
一.为什么需要SVN 你们在做中级项目中,都是采用小组合作开发的?那么说说你们在后期整合中遇到问题? 主要应用于: 1.协作开发 2.远程协作 3.版本回退 二.什么是SVN l svn全称SubVe ...