初始化

iOS性能优化

旧城冷巷雨未停 提交于 2020-03-01 16:16:58
一、App启动优化 1.App的启动可以分为2种 冷启动(Cold Launch):从零开始启动APP 热启动(Warm Launch):APP已经在内存中,在后台存活着,再次点击图标启动APP APP启动时间的优化,主要是针对冷启动进行优化 通过添加环境变量可以打印出APP的启动时间分析(Edit scheme -> Run -> Arguments) DYLD_PRINT_STATISTICS设置为 1 如果需要更详细的信息,那就将DYLD_PRINT_STATISTICS_DETAILS设置为1 2.App 冷启动分为四大阶段 dyld 加载可执行文件,动态库(递归加载) runtime main() 函数执行后 首屏渲染完成后 一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:1012951431, 分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!希望帮助开发者少走弯路。 2.1关于dyld 在Mac 、iOS中,是使用了/usr/lib/dyld程序来加载动态库 dynamic link editor,动态链接编辑器 dynamic loader,动态加载器 dyld 的源码 https://opensource.apple.com/tarballs/dyld/ initializeMainExecutable 方法开始的

线程之线程同步

风流意气都作罢 提交于 2020-03-01 12:51:01
本文来自个人博客: https://dunkwan.cn 文章目录 线程同步 互斥量 函数`pthread_mutex_timedlock` 读写锁 带有超时的读写锁 条件变量 自旋锁 屏障 线程同步 互斥量 互斥量从本质上来说是一把锁,在访问共享资源前对互斥量进行设置,在访问完成后释放互斥量。互斥量使用 pthread_mutex_t 数据类型表示的。在使用互斥量以前,必须首先对它进行初始化,可以把它设置为常量 PTHREAD_MUTEX_INITIALIZER (只适用于静态分配的互斥量),也可以通过调用 pthread_mutex_init 函数进行初始化。如果动态分配互斥量(例如通过调用 malloc 函数),在释放内存前需要调用 pthread_mutex_detroy 。 # include <pthread.h> int pthread_mutex_init ( pthread_mutex_t * restrict mutex , const pthread_mutexattr_t * restrict attr ) ; int pthread_mutex_destroy ( pthread_mutex_t * mutex ) ; 两个函数的返回值:若成功,返回 0 ;否则,返回错误编号。 要用默认的属性初始化互斥量,只需把 attr 设为 NULL 。

python中类与__init__的理解

江枫思渺然 提交于 2020-03-01 12:36:48
原文链接: https://www.zhihu.com/question/46973549/answer/767530541 作为典型的 面向对象 的语言,Python中 类 的 定义 和 使用 是不可或缺的一部分知识。对于有面向对象的经验、对 类 和 实例 的概念已经足够清晰的人,学习Python的这套定义规则不过是语法的迁移。但对新手小白而言,要想相对快速地跨过 __init__ 这道坎,还是结合一个简单例子来说比较好。 以创建一个“学生” 类 为例,最简单的语句是 class Student (): pass 当然,这样定义的类没有包含任何预定义的数据和功能。除了名字叫Student以外,它没有体现出任何“学生”应该具有的特点。但它是可用的,上述代码运行过后,通过类似 stu_1 = Student () 这样的语句,我们可以创建一个“学生” 实例 ,即一个具体的“学生”对象。 通过 class 语句定义的类 Student ,就好像一个 “模具” ,它可以定义作为一个学生应该具有的各种特点(这里暂未具体定义); 而在类名 Student 后加圆括号 () ,组成一个 类似函数调用 的形式 Student() ,则执行了一个叫做 实例化 的过程,即根据定义好的规则,创建一个包含具体数据的学生对象(实例)。 为了使用创建的学生实例 stu_1 ,我们可以继续为它添加或修改属性

jvm(二)、类的加载机制

浪子不回头ぞ 提交于 2020-03-01 12:22:37
一、类的加载过程 当程序主动使用某个类时,如果该类还未被加载到某个类中,则系统会经过以下三个步骤对该类初始化。 二、类的加载与ClassLoader的理解。 加载:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生产一个代表这个类的java.lang.Class对象,作为方法区中类数据的访问入口(即引用地址)。所有需要访问和使用类数据只能通过这个Class对象。这个加载过程需要类加载器参与。 链接:将java类的二进制代码合并到jvm的运行状态之中的过程。   验证:确保加载的类信息符合jvm规范,如:以cafe开头,没有安全方面的问题。   准备:正是为类变量(static)分配内存并设置类变量默认初始值的阶段,这些内存都将在方法区中进行分配。    解析:虚拟机常量池内的符号引用(常量名)替换为直接引用(地址)的过程。 初始化:执行类构造器<clinit>()方法的过程。类构造器<clinit>()方法是由编译期自动收集类中所有变量的赋值动作和静态代码块中的语句合并产生的。(类构造器是构造类信息的,不是构造该类对象的构造器)。   初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先出发其父类的初始化。   虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确枷锁和同步。 三、类加载器的作用 类加载器的作用

JVM学习五:JVM之类加载器之编译常量和主动使用

折月煮酒 提交于 2020-03-01 12:08:40
在学习了前面几节的内容后,相信大家已经对JAVA 虚拟机 加载类的过程有了一个认识和了解,那么本节,我们就继续进一步巩固前面所学知识和特殊点。 一、类的初始化回顾 类在初始化的时候,静态变量的声明语句以及静态代码块都被看作类的初始化语句,Java虚拟机会按照初始化语句在类文件中的先后顺序来依次加载它们。 上图中a的初始化其实经过了四步 1、a被初始化为默认值0 2、a被赋予正确的初始值1 3、执行静态代码块,将a的值赋为2 4、执行静态代码块,将a的值赋为4 因此最终的执行结果是4,一个类只能被一个ClassLoader加载一次,只有没有被加载过的类或者已经被卸载的类才可能被再次加载。类的初始化步骤如下: 1、假如这个类还没有被加载和连接,那就先进行加载和连接 2、假如存在直接的父类,并且这个父类还没有被初始化则先初始化直接的父类 3、假如类中存在初始化语句,那就依次执行初始化语句。 注意:Java虚 拟机在初始化一个类的时候要求它的父类已经被初始化,但是这条规则并不适应于接口!在初始化一个类的时候并不会初始化他所实现的接口!在初始化一个接口的 时候也不会去初始化他的父接口!因此一个父接口并不会因为他的实现类或者子接口的初始化而初始化,只有当程序使用该接口特定的静态变量的时候才会去初始化 这个接口! 我们上面的例子印证了第三点,对于前两点我们知道我们构造一个类的时候假设它有父类

简述类加载过程

谁都会走 提交于 2020-03-01 12:03:07
文章目录 1. 什么是类加载 2. 类加载共五大步骤 3. 什么时候触发类加载? 4. 类加载的具体流程 1. 什么是类加载 类加载就是将class文件加载入内存。 2. 类加载共五大步骤 加载 验证 准备 解析 初始化 五大流程的启动顺序: 注意: 这仅仅是启动过程,也就是说,当加载过程开始,并不一定要等到加载结束才开始下一个过程,而是可以同步进行。 加载,验证,准备,初始化的先后启动顺序是固定的。 而解析则有两种启动顺序,分别是在准备过程之后,和初始化之后。这样做是为了支持 动态绑定 。 3. 什么时候触发类加载? 什么时候类加载? 见到class文件就加载吗?当然不是。 因此什么时候类加载,回答当然是需要的时候才类加载。 谁需要呢?当然是虚拟机需要的时候。 在考虑完加载动机和需求对象之后,那么我们可以很容易想到: 当因虚拟机需要而触发初始化过程的时候,类加载就已经开始了。 为什么初始化开始就代表类加载开始呢? 与前面说过的启动流程有关。既然启动流程固定顺序是: 加载→验证→准备→…初始化 那么既然触发初始化了,那么其他三个必要过程肯定也相应已经开始。 有且仅有的四种触发初始化方式: 使用new,或者调用类的静态方法等等。 从字节码来说,就是调用了new, getstatic, pustatic, invokestatic这四条字节码指令。 使用反射机制的时候

wpa_supplicant代码初探收藏

≡放荡痞女 提交于 2020-03-01 09:31:07
wpa_supplicant代码初探收藏 这几天在尝试把wpa_supplicant移植到windows ce上,替换微软的WZC。先把源代码down下来,了解了一下大致的结构。 wpa_supplicant运行的整个 核心就是 eloop_run 函数 。这个函数负责处理应用程序的请求和数据链路层发来的EAPOL数据。eloop的针对不同的平台有好几个实现版本,我这里只讨论针对WIN32的eloop_win.c版本。 外部需要通过调用eloop_register_event或者eloop_register_read_sock来注册一个回调函数,并绑定了一个相应的事件。eloop会等待每一个事件的发生,并在事件发生时调用相应的回调函数进行处理。 所有与平台相关的网络驱动程序接口,都被通过wpa_driver_ops结构抽象成统一的接口,不管你是WEXT或者NDIS。因此也实现了平台无关性。 此外,wpa_supplicant与应用层通信的方式多种多样,有pipe、socket,你也可以实现自己的方式。只需要实现几个基本的函数就可以了: wpa_supplicant_global_ctrl_iface_init wpa_supplicant_global_ctrl_iface_deinit wpa_supplicant_ctrl_iface_init wpa_supplicant

PHP _ session 详解

左心房为你撑大大i 提交于 2020-03-01 09:18:16
http协议是WEB服务器与客户端(浏览器)相互通信的协议,它是一种无状态协议。所谓无状态,指的是不会维护http请求数据,http请求是独立的,非持久的。而越来越复杂的WEB应用,需要保存一些用户状态信息。这时候,Session这种方案应需而生。PHP从4.1开始支持Session管理。 session是很抽象的一个概念。我们不妨先从与它几个息息相关的有迹可寻的小切入点入手,然后逐渐地认识了解它。 session存储 首先,我们为什么需要Session,就是因为我们需要存储各个用户的状态数据。那么试问,如果由你来设计解决这个需求的方案,那么也许你会设置这样一个数据表用与存储各个用户的状态信息: uid created data max_age 94c55770fdf044a7 1270802787 jtUsername=admin 14400 2c37df64277e4409 1270822787 jtUsername=Joe;jtBooks=8; 14400 … … … … uid : 用户唯一标识符,区分其它用户 created : 记录产生时间 data : 存放与用户相关的数据 max_age : 记录的有效时间 同样地,PHP设计管理session方案也大致如此,它分别包含了以下信息: 1. session id 用户session唯一标识符,随机生成的一串字符串

wpa_supplicant 初始化流程分析

随声附和 提交于 2020-03-01 08:50:48
1. 启动命令 wpa supplicant 在启动时,启动命令可以带有很多参数,目前我们的启动命令如下: wpa_supplicant /system/bin/wpa_supplicant -Dwext -ieth0 -c/data/wifi/wpa_supplicant.conf -f/data/wifi/wpa_log.txt wpa_supplicant对于启动命令带的参数,用了两个数据结构来保存, 一个是 wpa_params, 另一个是wpa_interface. 这主要是考虑到wpa_supplicant是可以同时支持多个网络接口的。 wpa_params数据结构主要记录与网络接口无关的一些参数设置。 而每一个网络接口就用一个wpa_interface数据结构来记录。 在启动命令行中,可以用-N来指定将要描述一个新的网络接口,对于一个新的网络接口,可以用下面六个参数描述: -i<ifname> : 网络接口名称 -c<conf>: 配置文件名称 -C<ctrl_intf>: 控制接口名称 -D<driver>: 驱动类型 -p<driver_param>: 驱动参数 -b<br_ifname>: 桥接口名称 2. wpa_supplicant 初始化流程 2.1. main()函数: 在这个函数中,主要做了四件事。 a. 解析命令行传进的参数。 b. 调用wpa

ZStack云平台快速安装与初始化

孤街浪徒 提交于 2020-03-01 08:37:18
文章目录 如何准备安装环境,包括服务器,安装包及相关教程 准备安装环境 服务器环境准备 文档/视频教程 软件准备 安装ZStack 使用ISO创建系统 初始化ZStack 按UI提示初始化ZStack 创建云资源 如何部署ZStack 如何初始化ZStack 回顾 如何准备安装环境,包括服务器,安装包及相关教程 准备安装环境 服务器环境准备 准备服务器环境 1、 服务器需要满足基本的硬件条件需求:内存8G,硬盘40G 2、 CPU需要支持并开启虚拟化 文档/视频教程 官网获取ISO/教程 1、 获取ISO安装包 网址:www.zstack.io 2、 获取视频教程 3、 获取培训文档 只有视频,没有培训文档,不过一般使用过程中遇到的难题可以产考 帮助与支持中的常见问题! Q&A 1、 官网Q&A 2、 加入社区QQ群 3、 400电话/工单 软件准备 当 ISO镜像下载完成以后,可以利用软件创建虚拟机,也可以用物理机创建! 我用的是vmware14创建的ZStack 安装ZStack 使用ISO创建系统 新建虚拟机 选择自定义(高级),下一步 选择兼容性,点击下一步 选择稍后安装操作系统,点击下一步 操作系统选择linux,版本选择CentOS 7 64位,点击下一步 自定义虚拟机名称可以选择存放系统路径,然后点击下一步 选择4个cpu,然后点击下一步 选择8G内存,然后点击下一步