源码

YYModel 源码解读 总结

旧时模样 提交于 2020-02-02 06:01:10
在使用swfit写代码的过程中,使用了下oc写的字典转模型,发现有些属性转不成功,就萌生了阅读源码的想法。 其实一直都知道Runtime机制,但并没有系统的学习,可能是因为平时的使用比较少,无意间在github上看到了YYModel ,粗略的看了下源码,发现有大量的c方面的知识,就产生了很大的兴趣,因为c总是性能的代名词吗?于是就有了这几篇文章,其实主要的目的还是对平时所学知识的一个总结。 毕竟,人类的记忆总是容易忘记的。 不知道作者在写这个框架时的思想是怎么样一个过程?但字里行间都流露出对代码的强大的驾驭能力,这点特别值得学习。 阅读完这个框架给我最大的收获就是领悟到代码也是能表达很多事情的,比如说自信,因此决定去阅读更多更好的开源矿建,并记录下来,一来可以帮助到别人,同时也能学习到别人的思想。 好了,说一下,我理解的这样一个字典转模型的思想是什么样? 一 . 在写代码前应该有一个很好的设计,这个设计最起码是有张草图的,并不是天马星空的头脑风暴。 功能草图: 二. 有了上边的图表,就已经很明确我们的目标是什么了。因为市场上已经有这样的框架存在,所以说技术上是肯定能够实现的,可以不同的是实现手段而已。在这里先不对具体的技术进行归类,只是列出一个大概的技术需求 来源: https://www.cnblogs.com/machao/p/5651038.html

YYModel 源码解读(一)之YYModel.h

女生的网名这么多〃 提交于 2020-02-02 05:06:34
#if __has_include(<YYModel/YYModel.h>) FOUNDATION_EXPORT double YYModelVersionNumber; FOUNDATION_EXPORT const unsigned char YYModelVersionString[]; #import <YYModel/NSObject+YYModel.h> #import <YYModel/YYClassInfo.h> #else #import "NSObject+YYModel.h" #import "YYClassInfo.h" #endif __has_include 此宏传入一个你想引入文件的名称作为参数,如果该文件能够被引入则返回1,否则返回0。 拓展: #include / #import 语句有两种方式包含头文件,分别是使用双引号 " " 与左右尖括号 < > 。其区别是(对于不是使用完全文件路径名的)头文件的搜索顺序不同 使用双引号 " " 的头文件的搜索顺序: 包含该 #include 语句的源文件所在目录; 包含该 #include 语句的源文件的已经打开的头文件的逆序; 编译选项-I所指定的目录 环境变量INCLUDE所定义的目录 使用左右尖括号 < > 的头文件的搜索顺序: 编译选项-I所指定的目录 环境变量INCLUDE所定义的目录 再来介绍下

cinatra源码学习一:client_factory.hpp学习

限于喜欢 提交于 2020-02-02 00:40:53
client_factory.hpp文件源码 # pragma once # include "simple_client.hpp" namespace cinatra { class client_factory { public : static client_factory & instance ( ) { static client_factory instance ; return instance ; } template < typename . . . Args > auto new_client ( Args && . . . args ) { return std :: make_shared < simple_client > ( ios_ , std :: forward < Args > ( args ) . . . ) ; } void run ( ) { ios_ . run ( ) ; } void stop ( ) { ios_ . stop ( ) ; } private : client_factory ( ) : work_ ( ios_ ) { thd_ = std :: make_shared < std :: thread > ( [ this ] { ios_ . run ( ) ; } ) ; } ~ client_factory

Android9.0源码APP启动流程

半腔热情 提交于 2020-02-02 00:37:28
本文使用到的相关源码路径: Android9.0 APP启动源码 1、启动简介 1.1、启动流程: 点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求; system_server进程接收到请求后,向Zygote进程发送创建进程的请求; Zygote进程fork出新的子进程,即App进程; App进程,通过Binder IPC向sytem_server进程发起attachApplication请求; system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送创建Activity请求; App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送消息执行创建事务; 主线程在收到Message后,通过反射机制创建目标Activity,并回调Activity.onCreate()等方法; 到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面; 1.2、Activity启动流程图 1.3、其中涉及到的进程交互方式 Launcher进程与AMS所在的System_Server进程为AIDL方式;

凯撒密码源码(python)

我们两清 提交于 2020-02-02 00:34:15
''' 凯撒密码 @auhor 郭财德 蔡泽雄 @time 2019/01/20 ''' #编码对照表 LETTERSI = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' LETTERSII = 'abcdefghijklmnopqrstuvwxyz' class Caetsar ( ) : ''' Encrypt: 加密方法 Decrypt: 解密方法 ''' def __init__ ( self ) : pass def Encrypt ( self , string = "" , x = 0 , blank = ' ' ) : ''' 对输入的字符串进行加密 args={ string: 用于加密的字符串 mode: 是否区分大小写,默认全为小写 blank: 密文间隔符号 } ''' print ( "密文:" + string ) if x == 0 : self . mstr = string . lower ( ) else : self . mstr = string self . cstr = '' print ( '请输入加密的密钥(0~26):' ) key = input ( ) for symble in self . mstr : if symble in LETTERSII : num = LETTERSII . find (

从源码角度深入理解LayoutInflater

两盒软妹~` 提交于 2020-02-02 00:14:24
关于LayoutInflater,在开发中经常会遇到,特别是在使用ListView的时候,这个几乎是必不可少。今天我们就一起来探讨LayoutInflater的工作原理。 一般情况下,有两种方式获得一个LayoutInflater实例: LayoutInflater inflater1, inflater2; inflater1 = LayoutInflater.from(this); inflater2 = (LayoutInflater) this .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 但是当我们查看源码的时候,却发现这两种其实是一种,只不过第一种将第二种封装了一下,我们看看from这个方法的源码: /** * Obtains the LayoutInflater from the given context. */ public static LayoutInflater from(Context context) { LayoutInflater LayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); if (LayoutInflater == null) { throw new

从源码角度深入理解LayoutInflater

蓝咒 提交于 2020-02-02 00:11:15
关于LayoutInflater,在开发中经常会遇到,特别是在使用ListView的时候,这个几乎是必不可少。今天我们就一起来探讨LayoutInflater的工作原理。 一般情况下,有两种方式获得一个LayoutInflater实例: LayoutInflater inflater1, inflater2; inflater1 = LayoutInflater.from(this); inflater2 = (LayoutInflater) this .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 但是当我们查看源码的时候,却发现这两种其实是一种,只不过第一种将第二种封装了一下,我们看看from这个方法的源码: /** * Obtains the LayoutInflater from the given context. */ public static LayoutInflater from(Context context) { LayoutInflater LayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); if (LayoutInflater == null) { throw new

mono subscribe源码分析

独自空忆成欢 提交于 2020-02-01 23:00:30
https://blog.csdn.net/john1337/article/details/101028908 这篇文章已经对整个project reactor工作流程做了概述,本文对mono的subscribe源码进行更细的描述: 本文将以实际代码来分析下project reactor常见的subscribe工作原理 Mono.just("hello") .filter(t->t.startsWith("h")) .map(String::toUpperCase) .subscribe(System.out::println); 上面是一个简单的反应式编程的代码,mono.just创建数据源,然后经过filter经过过滤处理,然后经过map进行处理,熟悉jdk stream的对map这个操作一定不会陌生,map及其以前的操作仅仅是创建了一个publisher,上面仅仅是声明阶段,并没有产生实际效果,只有经过了subscribe之后才开始工作,下面就用上面的代码来分析下整个工作流程。 /*** **该方法会根据声明部分创建完整发布、订阅关系链 *本例子中涉及到下面几个订阅者类:LambdaMonoSubscriber、MapFuseableSubscriber以及 *FilterFuseableSubscriber ***/ public final void subscribe

java 虚拟机源码分析

醉酒当歌 提交于 2020-02-01 22:47:14
​openjdk下载: 地址: http://hg.openjdk.java.net 下载openjdk7 Hotspot下的模块: Adlc: 平台描述文件 Libadt: 抽象数据结构 Asm: 汇编器 Code: 机器码生生成 C1: client编译器, 即C1编译器 Ci: 动态编译器 Compiler: 调用动态编译器的接口 Opto: Server编译器,即C2编译器 Shark: 基于LLVM实现的即时编译器 Interpreter: 解释器 Classfile: Class文件解析和类的链接等 Gc_interface: GC接口 Gc_implementation: 垃圾收集器的具体实现 Memory: 内存管理 Oops: JVM内部对象表示 Prims: HotSpot对外接口 Runtime: 运行时 Services: JMX接口 Utilizes: 内部工具类和公共函数 搭建编译环境: 操作系统: Ubuntu 12.10 编译环境: GCC4.7 , G++4.6 和 GDB7.5 , jdk1.6 要使用Oracle的 jdk1.6 编译脚本: #!/bin/bash export LANG=C #导入JDK路径 #这是我的jdk1.6路径 export ALT_BOOTDIR="/home/laoyuan/work/soft/jdk1.6"

linux下源码安装

本秂侑毒 提交于 2020-02-01 20:22:26
●源码的安装(./configure –prefix 命令用法) 一般由3个步骤组成:配置(configure)、编译(make)、安装(make install)。 Configure是一个可执行脚本,它有很多选项,使用命令./configure –help输出详细的选项列表,如下: -bash-3.00# ./configure --help Usage: configure [options] [host] Options: [defaults in brackets after descriptions] Configuration: --cache-file=FILE cache test results in FILE --help print this message --no-create do not create output files --quiet, --silent do not print `checking...' messages --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX [/usr