认识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 之间的通讯.同步 一个简单的事务处理的例子 对于下面这样的非并发的程序: ...
随机推荐
- 【原创】试用十天被Pass所带来的启示
试用十天被Pass所带来的启示 招聘是门学问,很多人在研究,也有很多方案,不过面对人员难聘问题,很多方法又不灵了.于是我们采用了降低标准方案,扩招进来一些人员,于是问题又来了,想不想听我亲身经历的 ...
- ArcGIS“一个或多个ActiveX控件无法显示...”问题的解决方案
ArcMap启动时的一个警告信息“一个或多个ActiveX控件无法显示...”,如图 出现这种情况,有可能的原因是IE浏览器的安全选项设置被修改了.比如被手动修改过,或者被第三方系统杀毒优化软件修改了 ...
- 有关web 语义的文章总结
A web of data that can be processed directly and indirectly by machines. --Tim Berners-Lee web ...
- Android学习笔记之使用LBS实现定位
PS:最近一直在搞使用LBS实现定位.一般现在涉及到日常生活交易平台的app.貌似都需要使用定位.比如说美团外卖,我请客等app. 学习内容: 1.LBS定位的简单介绍. 2.在Map上添加地图覆盖物 ...
- PHP 表单验证--安全性--小记
HTML 表单数据进行适当的验证对于防范黑客和垃圾邮件很重要! -------------------------------------------------------------------- ...
- Winform开发框架之插件化应用框架实现
支持插件化应用的开发框架能给程序带来无穷的生命力,也是目前很多系统.程序追求的重要方向之一,插件化的模块,在遵循一定的接口标准的基础上,可以实现快速集成,也就是所谓的热插拔操作,可以无限对已经开发好系 ...
- js获取url参数的两种方法
js获取参数,在以前我都是用正在去拆分,然后获取,这种方式感觉是最简单的 方式1: function QueryString(item) { var sValue=location.search.ma ...
- 消灭Bug!18款最佳的问题跟踪管理应用程序
摘要:工欲善其事,必先利其器,对于开发者来说,处理Bug是一件比较头疼的事,那么如何高效地解决Bug,选择一款合适的Bug跟踪处理工具会让你事半功倍. 对于开发者来说,Bug往往是他们最头疼的问题.有 ...
- Python好用的网站收集
第三方Pthon包查找:http://www.lfd.uci.edu/ http://www.cnblogs.com/lanxuezaipiao/p/3543658.html
- 不可或缺 Windows Native (6) - C 语言: 函数
[源码下载] 不可或缺 Windows Native (6) - C 语言: 函数 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 函数 示例cFunction.h # ...