认识Runtime2
我定义了一个Person类作为测试。
其中Person.h:
//
// Person.h
// Test
//
// Created by zhanggui on 15/8/16.
// Copyright (c) 2015年 zhanggui. All rights reserved.
// #import <Foundation/Foundation.h>
#import <UIKit/UITabBar.h>
@protocol PersonDelete <NSObject> - (void)protocolMethod1;
- (void)protocolMethod2; @end
@interface Person : NSObject<UITabBarDelegate> @property (nonatomic,copy)NSString *name;
@property (nonatomic,assign)NSUInteger age;
@property (nonatomic,copy)NSString *address;
- (void)personRun;
- (void)eat;
- (void)goToSchool:(NSString *)vehicle; + (void)method1;
@end
Person.m:
//
// Person.m
// Test
//
// Created by zhanggui on 15/8/16.
// Copyright (c) 2015年 zhanggui. All rights reserved.
// #import "Person.h" @implementation Person - (void)personRun {
NSLog(@"run method was called");
}
- (void)eat {
NSLog(@"eat method was called");
}
- (void)goToSchool:(NSString *)vehicle {
NSLog(@"Person go to school by %@",vehicle);
}
+ (void)method1 {
NSLog(@"类方法");
}
@end
然后集中在ViewController中的viewDieLoad方法中测试:(具体的讲解都在注释中了)
- (void)viewDidLoad {
[super viewDidLoad];
Person *person = [[Person alloc] init];
unsigned int outCount = ;
Class cls = person.class; //得到Person的class
//--------------------类名
NSLog(@"类名是 :%s",class_getName(cls));
//-----------父类
NSLog(@"父类名是:%s",class_getName(class_getSuperclass(cls)));
//是否是元类
if (class_isMetaClass(cls)) {
NSLog(@"Person是元类");
}else
{
NSLog(@"Person不是元类");
}
//返回指定类的元类
Class meta_class = objc_getMetaClass(class_getName(cls));
NSLog(@"%ss 的元类 是 %s",class_getName(cls),class_getName(meta_class));
//变量实例大小 %zu用来输出size_t类型的。
NSLog(@"实例大小::%zu",class_getInstanceSize(cls));
//成员变量 Iavr:一个不透明的类型代表实例变量。这里可以得到其所有的成员变量
Ivar *ivars = class_copyIvarList(cls, &outCount);
for (int i=;i<outCount;i++)
{
Ivar ivar = ivars[i];
NSLog(@"实例变量的名字:%s at index %d",ivar_getName(ivar),i);
}
free(ivars); //释放成员变量实例
//通过名字:获取指定的实例变量,,比如我想获取该类是否有_name这个变量就可以通过该方法获得。
Ivar string = class_getInstanceVariable(cls, "_name");
if (string!=NULL) {
NSLog(@"%s有实列变量:%s",class_getName(cls),ivar_getName(string));
}else
{
NSLog(@"%s没有指定的实列变量:%s",class_getName(cls),ivar_getName(string));
}
//属性操作:objc_porperty:代表公开的属性.class_getProperty的参数中:cls代表该类的class,name是该类的属性
objc_property_t array = class_getProperty(cls, "name");
if (array!=NULL) {
NSLog(@"属性:%s",property_getName(array));
}
//方法操作:
Method *methods = class_copyMethodList(cls, &outCount);
for (int i=; i<outCount; i++) {
Method method = methods[i];
NSLog(@"方法签名是:%s",sel_getName(method_getName(method))); //sel_getName:得到方法名字
}
free(methods); //释放methods所占用的内存
// typedef struct objc_method *Method;
//这里得到的是类方法
// struct objc_method {
// SEL method_name OBJC2_UNAVAILABLE;
// char *method_types OBJC2_UNAVAILABLE;
// IMP method_imp OBJC2_UNAVAILABLE;
// }
//IMP
Method classMethod = class_getClassMethod(cls, @selector(method1));
if (classMethod!=NULL) {
NSLog(@"%s 有该类方法:%s",class_getName(cls),sel_getName(method_getName(classMethod)));
}else
{
NSLog(@"%s 没有该类方法:%s",class_getName(cls),sel_getName(method_getName(classMethod)));
}
//判断类的实例是否相应某个方法:比如alloc就不响应,而init就相应
if (class_respondsToSelector(cls, @selector(alloc))) {
NSLog(@"Person实例 响应 alloc");
}else
{
NSLog(@"Person实例 不响应 alloc");
}
//函数指针
IMP imp = class_getMethodImplementation(cls, @selector(eat));
imp();
//获得该类具有的协议
Protocol *__unsafe_unretained * protocols = class_copyProtocolList(cls, &outCount);
Protocol *protocol;
for (int i=; i<outCount; i++) {
protocol = protocols[i];
NSLog(@"协议名称:%s",protocol_getName(protocol));
}
//判断是否遵守协议
if (class_conformsToProtocol(cls, protocol)) {
NSLog(@"Person遵守协议%s",protocol_getName(protocol));
}else
{
NSLog(@"Person不遵守协议%s",protocol_getName(protocol));
}
}
附:
参考与:http://southpeak.github.io/blog/2014/10/25/objective-c-runtime-yun-xing-shi-zhi-lei-yu-dui-xiang/
认识Runtime2的更多相关文章
- 腾讯云(Linux)安装.net core sdk2.1、net core runtime2.1
按照微软指令安装: sdk2.1:https://www.microsoft.com/net/download/linux-package-manager/centos/sdk-current 1. ...
- “前.NET Core时代”如何实现跨平台代码重用 ——程序集重用
除了在源代码层面实现共享("前.NET Core时代"如何实现跨平台代码重用 --源文件重用)之外,我们还可以跨平台共享同一个程序集,这种独立于具体平台的"中性" ...
- go runtime scheduler
 http://www.slideshare.net/matthewrdale/demystifying-the-go-scheduler http://www.cs.columbia.edu/~a ...
- .Net AppDomain.CurrentDomain.AppendPrivatePath(@"Libs");
今天就说说.Net中通过反射取得某个类型时,我们怎么知道这个类型在硬盘上的哪个角落?比如说,假如我们需要要求服务端动态载入某个数据源,那服务端怎么知道数据源在哪?网上大部分的教程都写着,可以使用Ass ...
- 尝鲜delphi开发android/ios_环境搭建
Delphi这又老树发新枝了,开始做终端程序开发了,这个东西的准确名字是:RAD Studio XE5,可以使用delphi和c++ builder进行终端开发. 我尽可能讲啰嗦一些,免得回头被人问. ...
- .Net冷知识之动态查找类型时的程序集路径问题
今天就说说.Net中通过反射取得某个类型时,我们怎么知道这个类型在硬盘上的哪个角落?比如说,假如我们需要要求服务端动态载入某个数据源,那服务端怎么知道数据源在哪? 网上大部分的教程都写着,可以使用As ...
- 使用 pprof 和 Flame-Graph 调试 Golang 应用
前言 最近用 Golang 实现了一个日志搜集上报程序(内部称 logger 项目),线上灰度测试过程发现 logger 占用 CPU 非常高(80% - 100%).而此项目之前就在线上使用,用于消 ...
- Android:CheckBox控件
1)ChexkBox继承自CompoundButton组件: 2)isChecked()--确定是否选中:setChecked(bool checked)--设置选中或取消选中: 3)监听事件:Com ...
- 理解channel 工作原理以及源码
Go 的并发特性 goroutines: 独立执行每个任务,并可能并行执行 channels: 用于 goroutines 之间的通讯.同步 一个简单的事务处理的例子 对于下面这样的非并发的程序: ...
随机推荐
- java攻城狮之路(Android篇)--Activity生命
一:Activity的激活 1.写一个类 extends Activity Activity是android的四大组件之一.Activity的激活分为显式意图激活和隐式意图激活.如果一个activit ...
- NopCommerce 开源商城下载配置安装
NopCommerce 是一款开源商城系统,提供了完整的解决方案.应该来说是目前最完善,功能最强劲的商城系统.基于ASP.NET MVC 框架,EF框架,数据库MSSQL. 系统版本涵盖了从MVC3. ...
- 【原创】试用十天被Pass所带来的启示
试用十天被Pass所带来的启示 招聘是门学问,很多人在研究,也有很多方案,不过面对人员难聘问题,很多方法又不灵了.于是我们采用了降低标准方案,扩招进来一些人员,于是问题又来了,想不想听我亲身经历的 ...
- 【解析 . PPT版】干货:阿里全息大数据构建与应用(包括:互联网金融、互联网+、精准营销...)
作者:毛波,阿里巴巴资深数据专家,阿里数据管理平台(DMP)产品负责人. 摘要: 回顾传统数据仓库.商业智能到大型分布式数据平台的进化历程,深入阐述阿里的数据发展历史和数据观,以阿里DMP平台为例深入 ...
- 爬虫技术 -- 基础学习(一)HTML规范化(附特殊字符编码表)
最近在做网页信息提取这方面的,由于没接触过这系列的知识点,所以逛博客,看文档~~看着finallyly大神的博文和文档,边看边学习边总结~~ 对网站页面进行信息提取,需要进行页面解析,解析的方法有以下 ...
- LeetCode——Gas Station
There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. You ...
- 《深入理解Java集合框架》系列文章
Introduction 关于C++标准模板库(Standard Template Library, STL)的书籍和资料有很多,关于Java集合框架(Java Collections Framewo ...
- 【Spark】----Spark on Yarn
最近从Hadoop 1.x 转到Hadoop 2.x 同时将一些java 程序转为Scala的程序将平台上的代码减少了很多,在实施的过程中,开到一些Spark相关的YARN的部署上都是基于之前的Had ...
- C#设计模式——模板方法(Template Method)
一.概述在软件开发中,对某一项操作往往有固定的算法结构,而具体的子步骤会因为不同的需要而有所不同.如何可以在稳定算法结构的同时来灵活应对子步骤变化的需求呢?二.模板方法模板方法是一种常见的设计模式,它 ...
- 设计模式--建造者(Builder)模式
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示 --<设计模 ...