OC运行时编程指南

oc调用swift OC调用Swift 如果你想在Objective-C工程中,嵌入Swift文件,实现OC调用Swift,那么这篇文章就能帮助你,由于本人最近在开发Swift项目,所以实现过OC调用Swift,在这过程中遇到过一些瓶颈,特此,将此文奉上,供大家参考。 OC调用Swift文件,需要创建桥接头文件,这个文件是当你在OC开发环境中创建Swift文件时由Xcode生成,该桥接头文件的命名是:-B 阅读详情

介绍

OC这个语言尽可能的将一些决定从编译和链接时推迟到运行时。它会尽可能的动态的处理事情。这意味这个语言 
不仅需要一个编译器,还需要一个运行时系统去执行编译过的代码。这个运行时系统扮演着对于OC这个语言操作系统的的角色,使得这个语言得以运行。

这个教程将探究NSObject这个类以及OC这个语言和运行时系统是如何进行交互的。特别是如何在运行时动态的根据类的范式加载类,并且传递给其他对象。同时这个教程还将告诉你如何在你的程序运行过程中找到你的对象的运行信息。

本教程的组织方式

本教程由如下几个部分组成:

更多

OC运行时编程指南描述了OC运行时库所支持的数据结构以及函数。你可以在自己的程序中使用这些接口和OC运行时系统进行交互。例如,你可以在运行时添加类和方法,或者取得已经加载的所有类的信息。

运行时系统的版本和平台

在不同的平台下存在着不同版本的OC运行时系统。

遗留版本和现在版本

有两个OC的运行时系统——遗留版本和现在版本 。现在版本是基于OC 2.0版本的语言,包含了一系列的心特征。遗留版本的运行时接口是在OC 1.0版本的语言中进行描述的。

比较两个版本的区别主要体现在如下方面:

  • 在遗留版本的运行时系统,如果你改变一个类的实例变量,你必须重新编译它的所有子类。
  • 在现在版本的鱼腥时系统,若果你改变一个类的实例变量,你无需重新编译他的所有子类。

平台

iPhone应用程序以及基于OS X 10.5+的64位应用程序是基于现在版本的运行时系统。

其他应用程序(基于OS X的32位应用程序)使用遗留版本的运行时系统。

和运行时系统进行交互

OC程序和运行时系统可以清晰的分为3个不同的级别: 
1.通过OC源代码。 
2.通过基础框架中NSObject类定义的方法。 
3.直接调用运行时方法。

OC源代码

大部分情况下,运行时系统的工作会在这个场景下自动完成。你只需要编写和编译OC代码就可以使用它。

当你编译的代码包含OC的类和方法时,编译器就会自动的实现语言动态特征的数据结构和函数调用。创建的数据结构回捕获类、类别定义以及协议声明的信息,同时还会捕获源码中的方法选择器,实例变量模板等信息。运行时函数最重要的函数就是负责消息传递的函数,详情参见消息传递这一章节。它是通过源码中的消息语句调用的。

NSObject方法

在Cocoa框架中的大部分对象都是NSObject的子类,所以大部分对象都会继承NSObject类定义的方法。(一个值得关注的例外就是NSProxy class,详情查看消息传递这一章节。)因此,NSObject的方法就“规范”了他所有子类的行为。然而,在少数情况下,NSObject并没有定义一个如何做某件事情的模板,它并没有提供所有必要的代码。

例如,NSObject类提供了一个description的实例方法用于返回这个类内容的一个字符串描述。这个方法主要用途是调试——GDB打印对象的命令(po指令)返回的内容就是这个方法的返回值。NSObject实现了这个方法,但是并不知道这个类到底包含了什么,因此它返回了包含这个类名称以及内存中地址的字符串。所有NSObject的子类都可以实现这个方法并返回类的详细描述,例如,基础框架里面的NSArray类的description就返回它包含所有对象的描述。

有些NSObject类的方法只是简单的查询运行时系统的信息,这些方法使得对象自身能够自己检查自己。例如,class这个方法,作用是查询一个对象所需的类;isKindOfClass:以及isMemberOfClass:是用来测试一个对象在继承链中的位置;conformsToProtocol:是用来检查一个对象是否实现某个协议,类似的这些方法赋予了一个对象可以在运行时检查自己的信息。

运行时函数

运行时系统是一个提供一系列公开函数接口以及数据结构的动态链接库,这些头文件位于/usr/include/objc。许多这些函数允许你使用纯C语言复写当你写OC代码时编译器做的事情。其他形式的接口则是通过NSObject类中定义的一些方法。这些方法是的可以用来实现其他的运行时接口以提高生产效率。但是这些对于OC语言进行编程并非是必须的,但是,少数的运行时函数在一些特殊情况下,对于OC程序还是很有用途的。接下来将介绍这些函数。

消息传递机制

本章描述消息表达式是如何被转换为objc_msgSend方法调用的,以及你如何让通过消息名称调用到方法。然后解释如何利用objc_msgSend,以及在需要的情况下避开动态绑定。

objc_msgSend函数

在OC语言里面,消息直到运行时才呗绑定为(C语言)方法。编译器会转化一个消息表达式,

?
1
[receiver message];

成为一次消息传递函数的调用,objc_msgSend。这个函数使用消息中的接收者以及方法对应的选择器作为他的最重要的参数:

?
1
objc_sendMsg(receiver, selector)

任何在消息中传递的阐述也会被objc_msgSend函数处理:

?
1
objc_sendMsg(receiver, selector, arg1, arg2, ...)

消息传递函数为动态绑定提供所有必要的内容:

  • 首先,它找到选择器调用的过程(方法实现)。由于同一个方法在不同的类中可能有不同的实现,这个精确的调用过程依赖于接收者所属于的类。
  • 然后,它会调用这个过程,传递接收者对象(一个指向其数据的指针),以及消息中定义的那些参数。
  • 最后,它传递过程调用的返回值作为它自身的返回值。

注意:编译器会自动调用消息传递函数。你不应该在自己的代码中直接调用该方法。


消息传递函数所使用的关键字隐藏在编译器编译生成的每个OC类和对象的结构体中。每一个类结构都包含如下两个本质的元素:

  • 一个指向父对象的指针。
  • 一个类消息分发表。这个表拥有把方法选择器和类中方法的内存地址联系起来的入口。例如,setOrigin::方法的的选择器是和该方法setOrigin::实现的入口地址进行关联的,display方法的选择器是和display方法的地址关联的,等等。

一个新对象一旦被创建,就会被分配内存,并且他的实例变量会被初始化。这些对象变量中的第一个就是指向该对象对应的类结构的指针。这个指针,叫做isa,给予这个对象访问其类信息,然后通过这个类,访问所有它继承自类的类信息。


注意:严格意义上来说,OC运行时系统依赖的isa指针并不是语言的一部分。在OC当中,一个对象需要“等于”一个以任何形式定义的objc_object结构体(在objc/objc.h中定义)。但是,你几乎不需要自己创建你自己的根对象,继承自NSObject或者NSProxy的对象回自动包含isa指针。


这些类元素以及对象结构通过一下的图片进行说明。

消息传递框架

当一个消息被传递到一个对象,消息传递函数会沿着对象的isa指针找到其类结构以查找方法选择器以及消息分发表。如果不能找到方法选择器,消息传递函数回继续查找其父类的指针查找方法选择器以及消息分发表,这个过程知道查找到继承树的根为止。一旦查找到对应的选择器,这个函数就会调用分发表里对应的方法地址,传递飞接收者对象的数据结构。

这就是运行时选择方法调用的方式,或者装逼点来说,在面向对象程序设计中,消息动态绑定到方法的方式。

为了加速这个消息调用的过程。运行时系统会缓存它们使用过的选择器以及起对应的方法地址。这些缓存是针对每个类单独缓存的,当然,这其中包含它自己定义的方法以及继承自父类的方法。在搜索分发表之前,消息传递路由会先检查接收消息接收类的缓存(基于如果干过一次就很可能还会干下一次的理论)。如果消息选择器存在在缓存中,消息传递只比直接的函数调用慢那么一点点。一旦一个程序已经跑了足够长的时间以“预热”他的缓存,几乎所有发送的消息就都可能被缓存了。缓存是根据程序运行时新消息的调用动态增长的。

使用隐藏参数

一旦objc_msgSend方法发现一个方法实现的调用过程,它就会调用改过程,并且传递消息中定义的所有变量。而且它还会传递两个隐藏变量:

  • 接收者对象
  • 方法选择器

这些参数使得每个方法的实现可以知道调用者和接受者的明确信息。之所以说他们是“隐藏”的,是因为他们并没有显式的声明在方法里面。它们是在代码编译时被安插到实现里面去的。

尽管这些参数并没有被明确的声明,源代码还可以引用到它们(就像它可以引用到接受者对象的实例变量一样)。一个方法引用接收者对象使用self变量,使用cmd变量引用其选择器。下面的例子中,cmd引用strange方法的选择器,self变量指向接收strange消息的对象。

?
1
2
3
4
5
6
7
8
- strange
{
     id target = getTheReceiver();
     SEL method = getTheMethod();
     if ( target == self || method == _cmd)
         return nil;
     return [target performSeletor:method];
}

self变量是两个变量中比较重要的一个。事实上,可以通过它访问到消息接收者的实例变量。

获取一个方法的地址

唯一一种避开动态绑定的方法是获取一个方法的地址然后直接按照函数的方式调用它。这种方式的一个使用场景是一个特殊的方法需要频繁被调用并且你希望避免每次的一连串的消息传递。。。

通过在NSObject中定义的methodForSelector方法,你可以获得一个指向方法实现入口的指针,然后通过这个指针调用该过程。methodForSelector返回的指针应该小心的被转化为合适的函数指针。返回值以及参数类型都要一一对应。

接下来的例子serFilled:消息对应的方法调用过程的实现:

?
1
2
3
4
5
6
7
void (*setter)(id, SEL, BOOL);
int i;
 
setter = ( void (*)(id, SEL, BOOL))[target methodForSelector: @selector (setFilled:)];
for ( int i = 0 ; i < 1000 ; i++) {
     setter(targetList(i), @selector (setFilled:), YES);
}

该函数调用的前两个参数分别是接收者对象(self)以及消息选择器(_cmd)。这些参数被隐藏在方法语法中,但是必须明确的给出当方法通过函数的方式调用。

使用methodForSelector:可以绕过动态绑定以节约消息传递的时间。然而,这种节约只有在一些特殊的消息需要被频繁调用多次的情况,就像上面展示的for循环中。


注意:methodForSelector是Cocoa运行时系统提供的,并不是OC这个语言的一部分。


动态加载机制

本章将介绍泽呢样动态的实现一个方法。

动态加载机制

编码过程中,你可能会遇到动态提供一个方法实现的时候。例如,OC语言中声明为@dynamic的属性:

?
1
@dynamic propertyName;

告诉编译器和这个属性关联的方法会被动态的提供。

你可以通过实现resolveInstanceMethod:以及resolveClassMethod:方法以动态的实现一个指定实例的选择器或者类方法。

一个OC的方法简单意义上来说就是一个至少有两个参数的C函数——self以及_cmd。你可以使用class_addMethod方法给一个类添加一个方法。然后,通过下面的方式:

?
1
2
3
4
void dynamicMethodIMP(id self, SEL _cmd) {
     // implemention ....
 
}

你可以动态的给一个类添加一个方法(称为resolveThisMethodDynamically)使用resolveInstanceMethod:像这样子:

?
1
2
3
4
5
6
7
8
9
10
@implementation MyClass
+ (BOOL)resolveInstanceMethod:(SEL)aSEL
{
   if (aSEL == @selector (resolveThisMethodDynamically)) {
         class_addMethod([self class ], aSEL, (IMP) dynamicMethodIMP, "v@:" );
         return YES;
     }
   return [ super resolveInstanceMethod:aSEL];
}
@end

大体上来说,消息转发机制和动态加载方法是正交的。一个类有机会动态的加载一个方法在转发机制介入之前。如果respondsToSelector:或者instancesRespondToSelector:被调用,动态加载机制会有机会首先给选择器提供一个IMP。如果你实现了resolveInstanceMethod:,但是希望一些选择器实际上通过转发机制加载,你可以选择将这些选择器返回NO。

动态加载

一个OC应用程序可以动态的加载和链接新的类和类别。这些新加入的代码回像最初加入的类和类别一样平等的对待。

动态加载可以被用在许多不同的事情上面。例如,许多系统设置程序程序中的模块都是被动态加载的。

在Cocoa环境中,动态加载普遍被应用在个性化应用程序上面。别人可以通过编写你的应用程序在运行时加载的模块——就像IB(Interface Builder)加载自定义的组件和OS X系统设置程序加载自定义设置模块一样。可加载模块扩展了你的应用程序。他们通过你允许的方式但是你并未参与和定义的方式加载。你提供框架,别人提供代码。

尽管有一个OC运行时函数提供动态加载OC模块(objc_loadModules, 定义在objc/objc-load.h中),Cocoa的NSBundle类提供了更方便的动态加载的接口——一个面向对象的并且和相关服务整合的接口。相关内容可以相关参考相关文档。

在 Windows 上安装 OpenCV – C++ / Python 而且,安装并不是一件容易的事。这些安装程序仅适用于安装 OpenCV for C++。如果您想安装适用于 Python 的 OpenCV,您将在博客后面找到相关信息。在这篇博文中,我们将在 Windows 上安装适用于 C++ 和 Python 的 OpenCV。C++ 安装是在自定义安装 exe 文件的帮助下完成的。而Python的安装是通过Anaconda完成的。从源代码安装 OpenCV 需要花费大量时间。根据您的硬件和安装配置,该过程可能需要 5 分钟到 2 小时不等。 阅读详情

相关推荐

ArcMap学习笔记(三)地图数字化

地图数字化前言地图数字化实现步骤1.加载地形图2.新建要素图层3.开启编辑环境4.设置捕捉环境5.选择数字化图层6.数字化控制点7.数字化等高线8.数字化图幅边框9.保存数字化成果总结 前言 使用软件:ArcMap10.4.1中文版 如果出现侵权,请在评论留言,我会及时删除,谢谢。 地图数字化 空间数据采集(输入)是将现有的地图、外业观测成果、航空像片、遥感图片数据、文本资料等转换成GIS可以直接...

JayWang博客 1万+

对iOS runtime methodForSelector 方法的一点理解2

看了很多关于 runtime  的文章,总是只了解大概到原理,具体的方法细节 还是一知半解。 今天 看了 一篇文章 关于  methodForSelector  方法的介绍,更加加深了理解,对runtime 也有了全新点认识。 https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ObjCRuntime

圣人男的博客 1971

VS2022命令行编译C++报错?一招解决‘fatal error C1034: iostream: 不包括路径集‘

本文针对VS2022命令行编译C++时常见的'fatal error C1034: iostream: 不包括路径集'错误,深入剖析了其根源在于环境变量缺失。文章提供了永久配置用户环境变量(PATH、INCLUDE、LIB)的一劳永逸解决方案,确保在任何终端中都能直接使用cl命令进行编译,并给出了进阶配置与常见错误排查指南。

weixin_29011667的博客 304

oc调用CMD命令

网上查到的在处理中文路径时有问题,最后查到了下面的方式: + (NSString *)executeCommand: (NSString *)cmd { NSString *output = [NSString string]; //这个对中文有问题 //FILE *pipe = popen([cmd cStringUsingEncoding: NSASCIIStringEncoding], "r+"); FILE *pipe = popen([cmd...

gaoyp的专栏 956

ArcGIS插值可视化气象数据

前言 地图底图的制作和气象数据的预处理见我上两篇博客 ArcGIS精美中国地图制作(详解) python处理日值气象数据 在前面我们已经将日值的地温数据处理成了年均地温,添加了站点经纬度坐标并导出为excel格式。 得到如下数据: 导入数据 在Arcmap中 文件-添加XY数据 将年均地温和站点位置数据导入。 注意:excel表格的格式要另存为97-2003工作簿形式,否则会有"arcgi...

江北20190411的博客 2万+

【ubuntu】【VirtualBox】VirtualBox无法加载USB移动设备的解决方法(支持U盘启动盘)

提示:测试可用。

联系方式:927632640 2439

oc methodForSelector与instanceMethodForSelector区别

- (IMP)methodForSelector:(SEL)aSelector如果接受者是一个类对象,则返回类对象的方法;如果接受者是一个实例对象,则返回实例对象的方法; + (IMP)instanceMethodForSelector:(SEL)aSelector返回一个对应aSelector的实例方法下面是个demo #import <Foundation/Founda...

weixin_30787531的博客 387

基于Jeecgboot3.9.0的flowable7.2.0流程增加一个OA请假单功能例子(二)

基于Jeecgboot3.9.0的flowable7.2.0流程增加一个OA请假单功能例子(二)

宁波阿成的博客 198

ios Runtime(一) 详解

简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的。 Runtime的特性主要是消息(方法)传递,如果消息(方法)在对象中找不到,就进行转发 Runtime 的作用 Objc 在三种层面上与 Runtime 系统进行交互: 1.通过 Objective-C 源代码 2.通过 Foundation 框架的...

Z1591090的博客 1263

毕设-MobileNetV4:给YOLOv8装上轻量化“引擎”——通用瓶颈与C2f融合的实战教程

本文介绍了一种将MobileNetV4与YOLOv8结合的目标检测模型轻量化方案。MobileNetV4通过通用瓶颈(UB)结构实现多任务适配,其核心改进包括动态卷积核、注意力机制和多路径特征聚合,显著提升特征提取能力。作者详细阐述了如何在YOLOv8框架中实现MobileNetV4的通用瓶颈模块,包括"膨胀-卷积-注意力-压缩"的流程设计,并构建完整的backbone网络。该方案通过融合MobileNetV4的轻量化优势与YOLOv8的高效检测架构,在移动设备上实现了精度与速度的良好平

FJN110的博客 503

【经验&技巧】IBIS AMI模型眼图仿真问题探讨

在ADS的仿真环境中,不论发送和接收的AMI模型是否为true或者false,都可以将通道仿真设置为统计模式,但是,如果有一方的Init函数为false,在统计模式下,处于false状态的模型将不能执行其自带的后处理功能,如下图所示,左边的统计模式和右边的逐比特模式眼图存在明显的差异,原因在于,接收端的init函数为false导致在统计模式中不能对眼图进行DFE处理,换言之,此时统计模式下的眼图就是未经任何处理的“生图”。

一只豌豆象的博客 1765

OC 运行时编程指南翻译

Objective-C Runtime   Programming Guide              

hytzxd的专栏 979

Vue3 - Element Plus 表格组件 el-table “表格行数据中又嵌套了二维对象数组“,按平级循环渲染(嵌套数组视为同级行数据), 对嵌套的数组循环展示为表格,智能合并行或列详细教程

vue3,nuxt3,element-plus,table表格组件,el-table,vue3element表格组件,数据中有二维数组怎么遍历循环显示,表格数据带二级数组怎么循环渲染显示,表格数据中存在一个数组要怎么才能显示到表格,el-table表格合并详细教程示例,table表格如果对象里面还有对象数组那该怎么去渲染,平常都是数组中一个对象渲染成一行,每行中还有嵌套数组怎么办,每个行数据下还有一个数组怎么显示,怎么把表格相同的数据合并为一行,合并上下两行相同数据单元格,合并行或列如果遇到相同单元格就合

🏆 前端领域优质创作者 1万+

[OC Runtime编程指南_翻译]三、与运行时交互

Objective-C程序在三个不同的层次与运行时系统交互:通过Objective-C源码;通过在基础框架的NSObject类中定义的方法;通过直接调用运行时函数。 Objective-C 源码 在大多数情况下,运行时系统在后台自动工作。您只需编写和编译Objective-C源代码就可以使用它。 当您编译包含Objective-C类和方法的代码时,编译器将创建实现语言动态特性的数据结构和函数调用。数据结构捕获类和类别定义以及协议声明中的信息;它们包括在用 _Objective-C _编程语言 定义类和 协议

lin1109221208的博客 353

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

[OC Runtime编程指南_翻译]一、介绍 & 二、运行时版本和平台

注:Objective-C Runtime Programming Guide. 一、介绍 重要提示:此文档不再更新。有关Apple SDK的最新信息,请访问 文档网站。 Objective-C语言将尽可能多的决策从编译时和链接时间延迟到运行时。只要有可能,它都是动态的。这意味着该语言不仅需要编译器,还需要运行时系统来执行编译后的代码。运行时系统作为Objective-C语言的一种操作系统;它使语言工作。 这个文档介绍了NSObject类以及Objective-C程序如何与运行时系统交互。特别是,它检查了在

lin1109221208的博客 396

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

object c 运行时编程指南

在baidu文库里发现了一篇好文章:Objective-C 2.0 运行时系统编程指南 ,不敢独享。http://wenku.baidu.com/view/e5f32600a6c30c2259019ef5.html 文章写的蛮好,对object c的分析还时很不错的。 ...

weixin_34366546的博客 84

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

objective-C运行时编程指南之消息

消息 这章节讲述怎么样把消息表达式转换成objc_msgSend方法调用,并且怎么样通过名称引用方法。然后解释怎么利用objc_msgSend,并且如果必要的话,怎么避免动态绑定。 objc_msgSend方法 在Objective-C中,消息不必去方法实现直到运行时。编译器把一个消息表达式转换成消息方法objc_msgSend上的一次调用。这个方法需要接收者和在消息中提到方法的名称——即方

wukongtech 844

浅谈OC运行时(RunTime)

浅谈OC运行时(RunTime)  本文转自好友 逗姜哈士奇常说OC是一门动态语言,这使得OC开发可以变得相当灵活,但是归根结底OC还是一种编译型的语言,其具有一定的动态性,但是其动态特性也比不上JavaScript这种解释型的语言。OC的动态性主要体现在这个文件中,下面我们打开这个文件,对其总结一下。一、基本结构及其继承关系要谈runtime首先必然要先了解OC的对象以及类的结构,这非常有助与我...

等待化茧成蝶的专栏 779

OC 运行时系统

Google OC 方法签名 的时候突然发现了这个 感觉不错 : http://www.imooc.com/wenda/detail/244088 http://my.oschina.net/charsunny/blog/200971 OC这个语言尽可能的将一些决定从编译和链接时推迟到运行时。它会尽可能的动态的处理事情。这意味这个语言 不仅需要一个编译器,还需要一个运行时系统去执行

u013570474的专栏 505

OC运行时机制之Runtime

一、runtime简介 RunTime简称运行时。OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制。对于C语言,函数的调用在编译的时候会决定调用哪个函数。对于OC的函数,属于动态调用过程,在编译的时候并不能决定真正调用哪个函数,只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。事实证明: 在编译阶段,OC可以调用任何函数,即使这个函数并未实现,只要声明过

Walden_tinghou的专栏 1998

OC运行时和方法机制笔记

在OC当中,属性是对字段的一种特殊封装手段。 在编译期,编译器会将对字段的访问替换为内存偏移量,实质是一种硬编码。 如果增加一个字段,那么对象的内存排布就会改变,需要重新编译才行。 OC的做法是,把实例变量当做一种存储偏移量所用的特殊变量交给类对象来管理,偏移量会在运行期动态查找,这样无论何时访问实例变量,总能找到正确的地址。 可以在对象的内部(.m当中)直接使用下划线变量而不用...

diangou2756的博客 212

OC 运行时机制的一些应用

OC 运行时机制的一些应用

huangyongf的博客 1518

oc 运行时

1. runtime详细描述一、runtime简介 The Objective-C language defers as many decisions as it can from compile time and link time to runtime. Whenever possible, it does things dynamically. This means that the la

HOSTEN的博客 456
上一篇: iOS 之图片拖拽、捏合、双击缩放以及保存到相册
下一篇: NSObject之load和initialize方法详解
Shicuf
博客等级 码龄16年 11粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值