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. 装饰器 / 类中的方法 / 类的方法变属性 # ### 装饰器 """ 定义:装饰器用于拓展原来函数功能的一种语法,返回新函数替换旧函数 优点:在不更改原函数代码的 ...
随机推荐
- win10 tensorflow python3*,Multiprocessing using fit_generator(pickle_safe=True) fail问题解决
由于WIN版本的tensorflow使用 fit_generator时候,出现错误,但是mac 不会出现, 所以的解决方法就是https://github.com/fchollet/keras/iss ...
- hbase 学习(十五)缓存机制以及可以利用SSD作为存储的BucketCache
下面介绍Hbase的缓存机制: a.HBase在读取时,会以Block为单位进行cache,用来提升读的性能 b.Block可以分类为DataBlock(默认大小64K,存储KV).BloomBloc ...
- 局域网内的机器不能ping通虚拟机,但是虚拟机可以ping通局域网的机器
将虚拟机的网络网络适配器模式改成桥接模式即可: 一.选择虚拟机里面的设置: 二.在虚拟机设置界面将网络适配器模式改成桥接模式
- Qt的一些鲜为人知但是非常有用的小功能
1. Q_GADGET:不需要从QObject继承就可以使用Qt的Meta Object功能 2. Q_ENUMS:对枚举对象进行反射(reflection) 3. Q_SIGNAL:不需要sig ...
- WebGL 利用FBO完成立方体贴图。
这篇主要记录WebGL的一些基本要点,顺便也学习下如何使用FBO与环境贴图.先看下效果图(需要支持WebGL,Chrome,火狐,IE11). 主要实现过程如下,先用FBO输出当前环境在立方体纹理中, ...
- Spring Data Redis学习
本文是从为知笔记上复制过来的,懒得调整格式了,为知笔记版本是带格式的,内容也比这里全.点这里 为知笔记版本 Spring Data Redis 学习 Version 1.8.4.Release 前言 ...
- linux下硬盘的分区:
提到硬盘的分区,以前就是很乱,有什么主分区/扩展分区/逻辑分区等;它们有什么区别呢?现在简单的了解一下: 由于在MBR的主引导记录中的分区表里面最多只能记录4个分区记录,这个不够用啊,为了解决这个问题 ...
- Maven 构建配置文件
什么是构建配置文件? 生成配置文件是一组可以用来设置或覆盖 Maven 构建配置值的默认值.使用生成配置文件,你可以针对不同的环境,如:生产V/S开发环境自定义构建. 配置文件中指定 pom.xml ...
- 使用ClaimsIdentity来实现登录授权
背景:以前做登录时用的都是FormsAuthentication.SetAuthCookie(model.UID, IsRemeber),但是有一个不好,不能存储多个值,有时候我们既想存储登录用户的U ...
- perl 模块的创建以及制定perl 模块的路径
1) perl 模块的创建 perl 模块的后缀名为.pm, 其中的内容和一般的perl脚本相同, perl模块中通常放置可重用的函数以及变量, 比如创建一个fasta.pm,里面包含一个统计fast ...