自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Leo的专栏

Everything is an experiment, you win or learn~

  • 博客(302)
  • 资源 (33)
  • 收藏
  • 关注

原创 性能深度分析之SystemTrace

前言App中大多数的性能指标都和时间相关,如启动速度,列表滑动FPS,页面打开耗时等等。为了优化这些指标,我们需要了解时间都消耗在哪里。通常我们会打开Time Profiler,通过聚合Call Stack来分析和优化代码耗时。偶尔会出现优化后Time Profiler已经没有什么高耗时的Call Stack,但列表滑动仍然掉帧,这时候应该怎么办呢?不妨试试System Trace~一个实...

2020-03-08 19:12:00 6481 7

原创 深入理解Symbol

这里是引用前言符号(Symbol)是日常开发中经常接触的一个概念,虽然日常开发中直接应用的场景比较少,但符号编译期和运行时都扮演了重要的角色。符号是什么维基百科的定义A symbol in computer programming is a primitive data type whose instances have a unique human-readable form....

2019-11-30 23:02:55 6774 2

原创 聊聊应用内购买

前言上一份工作中,断断续续开发和维护了两年左右的内购,换工作后短期内应该不会做相关业务了,所以趁着“记忆”还是热乎的,写下这篇文章。希望读者通过阅读本文能够解决一些问题或者找到一些产品灵感,本文主要包括三个方面:内购的基本概念;代码层面如何开发,坑和对应的解决方案;应用审核和后续运营的注意事项;友情提示:本文很长~授之以渔以下官方资料,建议开发内购的同学静下心来通读一遍,能避免...

2019-04-21 23:04:31 19665 9

原创 深入浅出iOS编译

前言两年前曾经写过一篇关于编译的文章《iOS编译过程的原理和应用》,这篇文章介绍了iOS编译相关基础知识和简单应用,但也很有多问题都没有解释清楚:Clang和LLVM究竟是什么源文件到机器码的细节Linker做了哪些工作编译顺序如何确定头文件是什么?XCode是如何找到头文件的?Clang Module签名是什么?为什么要签名为了搞清楚这些问题,我们来挖掘下XCode编译iO...

2018-12-23 20:59:26 19548 8

原创 iOS 性能优化 - TimeProfiler分析代码耗时

Time ProfilerTime Profiler用来分析代码的执行时间,主要用来分析CPU使用情况。注意:要在release模式(或者自定义的其他的打包模式)下分析,原因在release模式下:会开启编译器优化,提高代码运行效率生成调试的符号表,这样才能够在profile的时候看到代码的调用栈多数条件编译只会在debug模式下生效,release模式和生产环境是一样的。Dem...

2018-11-20 23:37:02 7528

原创 iOS 性能优化 - Allocations分析内存分配

AllocationsAllocations用来分析静态内存分配。Demo项目Demo AppDemo是一个简单的图片应用:首页只有一个简单的入口;次级页面会读取本地页面,加滤镜,然后按照瀑布流的方式显示出来;第三个页面提供大图显示;运行代码:点击Photos -> 进入main -> 点击一张图,进入详情页 -> Pop直到回到第一个页面,重复这段操作,从XCode...

2018-10-21 14:45:24 7240 1

原创 XCode 10打包上传后在iOS 9上Crash(2018)

问题描述:XCode 10打包的App在iOS 9上Crash。原因:App Store的Bug,上传后的代码经过App Store处理后,加载assets中的图在iOS 9上会Crash。解决方案:切回到XCode 9.4打包,前提是你没有用到一些iOS 12的新特性。弃用Assets,把里面的图(除了icon和launch image)拖拽到项目里,按照普通图片的方式使用。等待...

2018-09-28 23:12:27 4867 4

原创 聊聊AppDelegate解耦

AppDelegate在iOS开发中,AppDelegate指的是UIApplicationDelegate,用来处理App层面的事件,包括生命周期变化,OpenURL,处理HandOff和Intent等。每个iOS都有一个入口函数main,其中的一个参数就是AppDelegate:int main(int argc, char *argv[]){ @autoreleasep...

2018-08-12 18:52:46 26837 1

原创 实现一个优雅的iOS事件总线

目标订阅登录事件LoginEvent,当self dealloc时候自动取消订阅[QTSub(self, LoginEvent) next:^(LoginEvent *event) {}];订阅通知NSNotification,当self dealloc的时候自动取消订阅//订阅通知name[QTSubNoti(self,"name") next:^(NSNotifi...

2018-07-12 22:33:40 7410 7

原创 深入理解iOS Crash Log

Crash LogCrash Log的主要来源有两种:Apple提供的,可以从用户设备中直接拷贝,或者从iTunes Connect(XCode)下载三方或者自研Framework统计,三方服务包括Fabric,Bugly等。这篇文章讲到的Crash Log是Apple提供的。获取设备获取USB连接设备,接着在XCode菜单栏依次选择:Window ->...

2018-07-06 21:11:36 30185 4

原创 XCode启动参数和环境变量

前言这一部分介绍XCode中Argument/Options模块,通过这两个模块,我们可以在启动App的时候传递一些额外的参数进去,覆盖系统的默认值,从而实现特定场景的调试。OptionsOptions这里的内容相对简单,但是却容易被忽略。Core Location用来模拟App的位置Application Data 可以用于测试CoreData的Scheme迁移Ro...

2018-06-30 12:54:57 5688 1

原创 Safari/Chrome调试WebView

前言最近在写《iOS代码调试》系列的博客,估计会有十篇以上的内容,等到都写完了会在Github开源出来,欢迎关注我的Github:LeoMobileDeveloperWebView大多数App会选择H5去实现某些弱交互但是却需要热更新界面,这时候WebView就派上用场了,那么如何对WebView进行调试呢?Safari开启开发菜单Safari -> 偏好设置...

2018-06-17 21:51:07 12461

原创 深入理解Toll-Free Bridging

前言Toll-Free Bridging本身不是什么新技术,那为什么还要写这篇博客呢?原因是今天和一个同事讨论到相关问题的时候,发现理解并不够深入,于是仔细研究了下,整理成了这篇博客。本文的Github地址:LeoMobileDeveloperToll-Free Bridging是什么?摘自文档: There are a number of data types i...

2018-04-26 15:28:28 4360 4

原创 iOS汇编精讲(上篇)

前言日常的应用开发中,主要用的语言是Objective(Swift),一些特殊场景下,可能还会用到C/C++,JavaScript,Shell,Python等。那么,一个iOS开发者为什么要了解汇编这么底层的语言呢? 因为看得懂汇编能够提高的代码调试和逆向能力。本文是作者学习汇编过程中整理的笔记,分为上下两篇:上篇主要是一些基础准备,下篇介绍Objective C汇编和一些逆...

2018-04-21 12:11:32 6665 7

原创 Sqlite的事务,锁和WAL模式

前言事务定义了一组SQL语句的边界,这组SQL语句要么都执行,要么都不执行,事务保证了数据库完整性中的原子性。事务与数据库锁是紧密相关的,Sqlite用锁来保证事务的并发和执行顺序。事务在讲解事务的原理之前,我们先看看事务相关的API,主要有三个:begin transaction 开始一个事务。其中,transaction可省略,直接写begin即可。rollback 回...

2018-03-21 22:49:14 3687

原创 Objective C范型

范型范型编程是一种程序语言设计范式,它允许程序员在使用强类型的语言编写代码的时候,延迟确定具体的类型。以Swift代码为例,假如有一个需求是要交换两个int,很容易写出类似代码func swapTwoInts(_ a: inout Int, _ b: inout Int) { let temporaryA = a a = b b = temporaryA}

2018-01-07 14:51:16 3048

原创 新年快乐

新年快乐

2017-12-31 21:33:10 1115 3

原创 Fishhook替换C函数的原理

FishhookFishhook是FaceBook出品的,可以用来Hook C函数的一个开源库。它的主要接口就一个:struct rebinding { const char *name; //字符串名称 void *replacement; //替换后的方法 void **replaced; //原始的方法(通常要存储下来,在替换后的方法里调用)};//两个参数分别是rebindin

2017-11-04 16:17:48 6460 1

原创 深入理解iOS App的启动过程

前言 启动时间是衡量应用品质的重要指标。本文首先会从原理上出发,讲解iOS系统是如何启动App的,然后从main函数之前和main函数之后两个角度去分析如何优化启动时间。准备知识Mach-O哪些名词指的是Mach-oExecutable 可执行文件Dylib 动态库Bundle 无法被连接的动态库,只能通过dlopen()加载Image 指的是Executable,Dylib或者Bun

2017-10-23 13:28:28 26768 23

原创 聊聊SQLite - 基础篇

SQLiteSQLite是一个关系型数据库,是一个嵌入式的数据库,它的核心代码由C编写,直接在宿主应用中运行。本来想一篇长文章涵盖想写的内容,最后发现想写的东西太多了,就拆分成:基础篇,原理篇和iOS应用篇发出来吧。MAC OS的命令行字带SQLite。以下示例均在命令行中进行,C API的使用会在之后的文章里讲解:表 在关系型数据库中,表是一组相关数据的集合,它包括行

2017-09-24 15:38:39 1716

原创 Moya的设计之道

前言 Moya是一个基于Alamofire开发的,轻量级的Swift网络层。Moya的可扩展性非常强,可以方便的RXSwift,PromiseKit和ObjectMapper结合。如果你的项目刚刚搭建,并且是纯Swift的,非常推荐以Moya为核心去搭建你的网络层。另外,如果你对Alamofire的源码感兴趣,推荐我之前的一篇博客:Alamofire的设计之道 Moya除了依赖Alamof

2017-08-11 13:44:52 8833 21

原创 实现60fps的网易云音乐首页

前言网易云音乐是一款很优秀的音乐软件,我也是它的忠实用户。最近在研究如何更好的开发TableView,接着我写了一个Model驱动的小框架 - MDTable。为了去验证框架的可用性,我选择了网易云音乐的首页来作为Demo,语言是Swift 3。本文的内容包括:实现网易云音乐首页的思路如何建立一个轻量级的UITableViewController(不到100行)性能瓶颈原因以分析及如何优化到接

2017-07-28 14:38:34 5664 6

原创 理解网络分层与数据加密

网络分层网络的基础分层是OSI的七层架构: OSI的全称是Open System Interconnection(开放系统互联模型),是由国际标准化组织ISO设计,解决不同体系结构网络互相连接的问题。实际应用中,五层架构是最常见的,也是最容易理解的:网络分层后,每一层都工作着不同的协议和实际的物理设备,下一层为上一层提供服务,上层的实现无需考虑下层的细节,相同层级之间进行相互通信。物理层

2017-07-22 20:29:34 4924

原创 优雅的开发TableView

前言UITableView(UITableViewController)是iOS开发使用频率最高的一个组件。不管是使用UITableView还是还是UITableViewController,在开发的时候,我们都需要实现两个协议:UITableViewControllerDataSourceUITableViewControllerDelegate这两个协议的代码不是写在Controller里

2017-06-19 11:57:34 7115 8

原创 MVVM与Controller瘦身实践

前言MVC是一个做iOS开发都知道的设计模式,也是Apple官方推荐的设计模式。实际上,Cocoa Touch就是按照MVC来设计的。这里,我们先不讲MVC是什么,我们先来谈谈软件设计的一些原则或者说理念。在开发App的时候,我们的基本目标有以下几点:可靠性 - App的功能能够正常使用健壮性 - 在用户非正常使用的时候,app也能够正常反应,不要崩溃效率性 - 启动时间,耗电,流量,界面反应

2017-06-12 11:20:19 11152 6

原创 Alamofire的设计之道

前言:Alamofire是一个由Swift编写的优雅的网络开发框架。大部分用Swift编写的iOS App的网络模块都是基于Alamofire的。作为Swift社区最活跃的几个项目之一,有许多开发者在不断的对其进行完善,所以学习这种优秀的开源代码对深入理解Swift的特性很有帮助。

2017-06-03 18:54:52 12615 3

原创 消息转发机制与Aspects源码解析

前言最近在搞重构相关的事情,遇到了不少这样的场景: 进入一个界面,在viewWillAppear:的时候做相应判断,如果满足条件则执行对应代码。这类业务有一个特点,业务内容是对应整个App的,与对应的ViewController毛关系都没有,但是却不得不耦合到(即使是调用代码可以精简到一行)ViewController中。我们都知道,这种类似的业务用AOP(面向切片编程)来做十分适合,所谓面向

2017-05-22 22:55:51 4257 2

原创 Objective C block背后的黑魔法

前言block在Objective C开发中应用非常广泛,我们知道block会捕获外部对象,也知道使用block要防止循环引用。那么block这套机制在Objective C中是如何实现的呢?本文通过从C/C++到汇编层面分析block的实现原理。Clangclang是XCode的编译器前端,编译器前端负责语法分析,语义分析,生成中间代码(intermediate representation )。

2017-04-17 14:24:44 6559 4

原创 深入理解Objective C的ARC机制

从Runtime源码和汇编的角度深入挖掘ARC的本质

2017-04-11 09:05:35 5726 2

原创 iOS 10越狱和Reveal 8分析三方App UI框架教程

前言这是一篇写给开发者的博客,如果碰巧非开发者搜到了这篇博客,那么博客的内容可能不适合你。其实网上Reveal的教程很多,但是很多都是停留在Reveal 1或者Reveal 2时代的博客,不太适合最新版本的Reveal 7,所以还是决定写这样一篇文章。本文最终的效果:淘宝首页:可以看到,淘宝首页其实就是一个巨大的CollectionView京东首页:可以看到,京东首页其实就是一个巨大的Tabl

2017-04-05 22:27:07 9412 3

原创 详解Swift中的错误处理

前言任何代码都会发生错误,这些错误有些是可以补救的,有些则只能让程序崩溃。良好的错误处理能够让你的代码健壮性提高,提高程序的稳定性。本文的Swift版本:Swift 3Objective C返回nil如果出错了,就返回空是Objective C中的一种常见的处理方式。因为在Objective C中,向nil发送消息是安全的。比如:- (instancetype)init{ self = [

2017-03-19 16:49:05 10190

原创 iOS自动化测试的那些干货

前言 如果有测试大佬发现内容不对,欢迎指正,我会及时修改。大多数的iOS App(没有持续集成)迭代流程是这样的也就是说,测试是发布之前的最后一道关卡。如果bug不能在测试中发现,那么bug 就会抵达用户,所以测试的完整性和可靠性十分重要。目前,大多数App还停留在人工测试阶段,人工测试投入的成本最低,能够保证核心功能的使用,而且测试人员不需要会写代码。但是,在很多测试场景下,人工测试的效率

2017-03-09 12:08:37 21054 3

原创 优雅的开发Swift和Objective C混编的Framework

前言为什么要写这样一篇文章,因为昨天和一个朋友讨论到Swift和Objective C如何混合开发Framework,中途发现了很多有意思的坑。用Swift封住哪个OC的库是一件比较常见的事情,毕竟对于大多数公司来说,老的代码都是用OC写的,而且经过多次迭代,这些OC的代码已经被验证了是稳定的,用Swift重写代价太大。这就引入了一个需求:用Swift和OC来混编一个Framework。如果你之

2017-03-02 16:41:58 14194 18

原创 iOS开发中常用的那些工具

工欲善其事,必先利其器。列表XCode 无须多说Instruments 性能分析工具:卡顿,内存,网络,数据存储等等xcodebuild and xcrun 命令行工具用来脚本打包和测试synx 把XCode工程中的Group自动映射到实际的文件夹oclint 静态分析Objetive C代码,发现隐藏问题xctool 基于xcodebuild的扩展,更方便的使用命令行测试Char

2017-02-23 21:17:52 7852

原创 React Native开发之快速入门React

前言这篇文章,是接着之前的一篇入门文章写的(虽然已经过去大半年了),本文的受众仍然是React小白,熟悉React的同学可以不看了。上一篇文章链接:为React Native开发写的JS和React入门知识上一篇文章主要介绍了JS的语言基础和React的component生命周期。本文会接着上一篇文章,继续讲解React的基础。本文的React Native版本是0.0.40,开发IDE是Ato

2017-01-17 11:27:08 4617 1

原创 GCD精讲(Swift 3&4)

前言我们首先来看一张图:我觉得这张动图很好的诠释了《把一个线程用到死的》核心价值观。很多程序都有一个主线程。对于iOS/MacOS开发来说,这个线程就是UI线程,在这个线程上会做一些用户交互/渲染相关的事情。把过多的任务放在主线程,会导致主线程卡顿,进而用户看到的就是App响应慢,列表滚动的时候掉帧。把任务分散到多个线程执行有很多种技术,在iOS/MacOS App开发中,最简单直观的就是GCD(又

2017-01-09 21:37:50 12308 3

原创 Swift Playground精讲

Playground是啥? Playground是一个强大的工具。对于Swift初学者来说,它简单易用,可以实时预览代码效果,非常适合学习Swift这门语言。在日常开发中,playground可以进行快速的原型开发和试错。当然,playground支持markup标注,用来Swift相关的书籍也不错。基础讲解工欲善其事,必先利其器首先,我们先来熟悉下Playground的IDE,这是官方给出的

2017-01-01 16:49:16 16854 2

原创 iOS开发 - 在状态栏显示FPS,CPU和内存信息

前言 今天在用Instruments分析App的时候,总感觉看起来不太直观。到Github上找了找,发现几乎都是只显示FPS的,而且效果也不是我想要的。于是就自己写了个源码地址LHPerformanceStatusBar效果字体颜色会根据阈值进行颜色变化,性能差的时候字体会变成红色,性能一般的时候会变成橘黄色,阈值可配。集成CocoaPod集成pod LHPerformanceStatus

2016-12-26 23:32:31 9027 18

原创 iOS编译过程的原理和应用

前言一般可以将编程语言分为两种,编译语言和直译式语言。像C++,Objective C都是编译语言。编译语言在执行的时候,必须先通过编译器生成机器码,机器码可以直接在CPU上执行,所以执行效率较高。像JavaScript,Python都是直译式语言。直译式语言不需要经过编译的过程,而是在执行的时候通过一个中间的解释器将代码解释为CPU可以执行的代码。所以,较编译语言来说,直译式语言效率

2016-12-10 11:58:12 34267 10

原创 Swift进阶之内存模型和方法调度

前言Apple今年推出了Swift3.0,较2.3来说,3.0是一次重大的升级。关于这次更新,在这里都可以找到,最主要的还是提高了Swift的性能,优化了Swift API的设计(命名)规范。前段时间对之前写的一个项目ImageMaskTransition做了简单迁移,先保证能在3.0下正常运行,只用了不到30分钟。总的来说,这次迁移还是非常轻松的。但是,有一点要注意:3.0的API设计规范较2.3

2016-11-13 16:08:01 9442 1

iOS内存泄漏调试工程

为博客提供的内存泄漏调试的工程,更多的信息要见我的博客

2015-06-05

CoreData ChildContext

使用ParentChild的Demo,更多详细讲解见我的博客

2015-06-01

使用多个Context的CoreData

讲解如何使用多个NSManagedContext

2015-06-01

CoreData与Tableview的Demo

iOS CoreData与Tableview结合的Demo。Demo实现了一个简单的员工管理软件。对于想要学习NSFetchedResultController的同学会有一些帮助的。另外,也可以看看我的文件组织架构,以及如何把功能类细化,对viewController以及Model瘦身。

2015-05-21

CoreDataDemo

用来学习如何建立堆栈以及如何进行四种基本操作的Demo,适合初学者

2015-05-12

iOS 8模糊(毛玻璃)效果

用iOS 8系统API实现的毛玻璃效果,几行代码即可实现,无需第三方库

2015-05-09

SwiftKeyChainDemo

一个Demo教你玩转iOSKeyChain,再也不愁保存密码了

2015-05-05

IBInspectableAndIBDesignableDemo

IBInspectable和IBDesignable的使用Demo,实现Storyboard的视图随着图形化界面的改变动态刷新

2015-04-26

IOS网络开发NSURLSession的Demo(上传+下载)

NSURLSession三种Task的详细Demo。希望对想要学习IOS网络开发的童鞋会有帮助。欢迎关注我的IOS-SDK详解专栏,如果你是个初学者,这里你会找到很多资源。http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html

2015-04-02

IOS 使用相机拍照和自定义拍照界面

Demo详细介绍了如何使用系统的相机,并且访问相册。第二个界面介绍了如何自定义拍照界面。详细讲解参见我的博客blog.csdn.net/hello_hwc

2015-04-01

7种IOS SDK提供的手势Demo

7种IOS手势Demo,适合想了解IOS 手势如何开发的同学

2015-03-04

用代码AutoLayout的Demo

用代码实现AutoLayout的demo,有关AutoLayout的详细讲解,请见我的博客。blog.csdn.net/hello_hwc

2015-03-02

自定义UIAlertview的Demo

自定义Alertview的Demo,给想要学习自定义的同学提供一些思路。建议看看我的博客,有这个demo的详细讲解blog.csdn.net/hello_hwc

2015-02-18

UIDynamic Animation Demo

UIDynamic Animation Demo,通过5个例子进行讲解。更多参见我的博客,blog.csdn.net/hello_hwc

2015-02-07

CoreAnimationDemo(二)用UIKit来实现

Demo里实现了7个动画,从7个角度详细阐述了如何从UIKit的角度进行CoreAnimation。 博客链接:blog.csdn.net/hello_hwc

2015-01-31

IOS中消息传递的8种方式Demo

一个Demo,几乎完整的介绍了全部IOS的传递方式,更多的参见我的博客

2015-01-29

EmbedSegue的Demo

嵌入式Segue和UITableViewController的Demo,有助于对嵌入式Segue的理解

2015-01-15

优雅的开发OC与Swift混编博客Demo

下载,解压缩,打开YourApplication

2017-06-08

IOKitHeaders

IOKitHeaders,为了让越狱项目yalu通过编译

2017-04-05

Swift实现淘宝和大众点评下拉刷新

项目地址https://github.com/LeoMobileDeveloper/PullToRefreshKit,如果觉得对你有帮助,请给我个star吧,我的下载都不需要积分的

2016-07-16

Swift实现下拉刷新,上拉加载,左/右滑动加载更多

项目地址,https://github.com/LeoMobileDeveloper/PullToRefreshKit,如果你喜欢这个项目,请到Github上给我个Star吧

2016-07-14

StateRestoration

Swift 使用Storybaord的状态保存例子

2016-05-26

自定义presentViewController的转场动画(Swift)

Swift自定义presentViewController的转场动画

2016-04-19

自定义转场博客的最初项目(配合博客使用)

配合《自定义presentViewController的转场动画(Swift)》一文写的最初项目,如果要学习博客可以下载,如果要看最终版的转场,请看我下一个上传项目

2016-04-19

UISearchController和tablview

UISearchController和tablview

2016-03-15

SpotLight搜索

iOS 9新增的API,可以为App添加SpotLight搜索,Demo工程是用Swift 2.1写的,更详细的讲解可以到我的博客里去找blog.csdn.net/hello_hwc。注意,XCode 7.2+才支持Swift 2.1

2015-12-19

ContactsFramework的Demo(Swift,通讯录)

Swift访问通讯录的简单例子,简单介绍了ContactsFramework和ContactsUI Framework

2015-11-28

AVPlayer播放视频的简单Demo

注意:仅供学习和参考用,想拿去直接用是不行的 AVPlayer播放视频的Demo。 支持: 1.播放,暂停,重播 2.按键触发全屏/设备旋转触发全屏 3.隐藏,显示控制图标 4.透明的导航栏

2015-10-12

iOS 视图复用访问相册

iOS 视图复用的例子,该例子以访问相册为例,侧重讲解,像直接拿去用还是建议Github上找,具体可以看看我的博客。

2015-09-21

仿微博Tabbar以及动画

仿照新浪微博App的Tabbar以及其动画,我想对想要研究对应技术的人还是有一些参考意义的。其实Demo稍微改改就可以直接拿去用了。

2015-08-31

仿今日头条的ToolBar

仿今日头条的Toolbar,感兴趣的同学可以下载来看看

2015-08-19

纯IB进行Scrollview的AutoLayout

纯IB在Scrollview中Autolayout,不需要任何代码

2015-07-15

同步和异步的NSOperation的Demo

Demo讲解了同步和异步的NSOperation的示例,更多的参见我的博客

2015-06-10

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除