Created with Sketch.
Created with Sketch.
首页
发现
小书
登录
注册
×
注册小专栏
通过微信登录
通过微博登录
通过Github登录
通过邮箱
注册
、
登录
友情提示
Login FAQ
.
×
邮箱登录
通过微信、微博、Github 登录
登录
×
邮箱注册
通过微信、微博、Github 登录
注册
icon_photo_1
Created with Sketch.
青衣
iOS&前端工程师
100 / 140
iOS&前端工程师
关注 3
被关注 24
获得赞 20
Created with Sketch.
Created with Sketch.
+ 关注
取消
确定
个人书籍
个人专栏
前端开发笔记
1. 记录前端开发中遇到的问题及解决 2. 学习前端的知识点总结 3. 前端框架源码学习
已发表 27
订阅数 2
iOS 开发笔记
专栏将包括这些内容: 1. 开发中遇到的问题以及怎么解决的 2.学习大牛文章的总结与练习 3.第三方框架学习以及使用
已发表 44
订阅数 601
文章
订阅
回复
喜欢
青衣
in
iOS 开发笔记
循环引用问题
ARC模式下循环引用问题 block的循环引用问题是比较常见的问题了 Person *p = [[Person alloc]init]; p.age = 12; p.block = ^{ NSLog(@"%d",p.age); }; xcode也提示我们存在了循环引用。 我们看下c++源代码就明白了 struct __main_b...
青衣
in
iOS 开发笔记
WebViewJavascriptBridge源码阅读
框架结构 WebViewJavascriptBridge_JS(js代码) WebViewJavascriptBridge(UIWebView) WKWebViewJavascriptBridge(WKWebView) WebViewJavascriptBridgeBase(公共类) js调用native 调用入口ExampleApp.html bridge.callHandler('testObjcCallback', {'foo': 'bar'}, fun...
青衣
in
前端开发笔记
自定义loader
loader的本质 loader的本质就是一个函数。最简单的函数可以无参无返,当然也可以有参数有返回值。loader就是一个有参数有返回值的函数。比如less-loader,就是把一些less语法转换成css语法。 主体逻辑代码如...
青衣
in
前端开发笔记
手动实现一个简单的打包工具
初始化工程如下 此时打开html会报错,因为使用了import,export,而浏览器不识别这种语法。以前我们都是使用webpack打包,引入打包生成的js文件。 今天我们自己实现一个简单的打包工具类。 大体思路如...
青衣
in
前端开发笔记
webpack开发调试
source map 打包后的js文件是被压缩的。如果程序发生了错误,提示很难让我们找到对应的错误发生点 修改printjs(接前面的文章) export default function printMe() { // console.log('I get called from print.js!'); console.error(...
青衣
in
iOS 开发笔记
block变量捕获
局部自动变量捕获 看下面一段代码,猜测下打印结果 int age = 10; void(^myblock)(void) = ^{ NSLog(@"%d",age); }; age = 20; myblock(); 猜对了吗?打印结果是10 为什么呢? 看下转成c++...
青衣
in
iOS 开发笔记
block的本质
一个最简单的block ^{ NSLog(@"123"); }; 调用block和调用函数一样 不过上面是个匿名block,我们用一个变量记录下 int age = 10; void(^myblock)(void)= ^(){ NSLog(@"%d",age); }; ...
青衣
in
前端开发笔记
webpack常用plugin使用
如果更改了入口文件的名字,那么html也要做相应的更改 output: { // filename: 'main.js', filename: '[name].bundle2.js', path: path.resolve(__dirname,'dist') }, 那么要跟着修改html中引用的名称 <!DOCTYPE htm...
青衣
in
前端开发笔记
The 'compilation' argument must be an instance of Compilatio...
依赖的包版本 "webpack": "^5.13.0", "webpack-cli": "^4.3.1", "html-webpack-plugin": "^4.5.1" 报错 The 'compilation' argument must be an instance of Compilation 解决 1.将webpack版本降到4.46.0,无效报其他错 2.卸载全局的webpack, fix
青衣
in
前端开发笔记
webpacks管理输出
webpack会从入口文件出开始,递归找到所有import的文件,最终打包到一个js文件中。这样就会导致js文件过大。可以按照功能模块进行拆分。每个模块一个入口的js文件,用到的时候再加载。 1.新建一个print.j...
青衣
in
前端开发笔记
webpack管理资源
webpack除了可以处理js,借助于loader,还可以处理css等其他各种资源文件。loader相当于一个翻译转换器。把我们使用的一些新技术新特性,按照给定的规则转换成浏览器可以识别的形式。 加载css webpack默认是...
青衣
in
前端开发笔记
从零开始使用webpack
最近都比较忙,没时间搞前端,昨天看single-spa的时候,想创建一个简单的项目,发现已经把webpack的内容忘的差不多了。今天觉得再捡起来,并且记录一下。 访问网页的本质实际上就是加载一个html文件,...
青衣
in
iOS 开发笔记
c++语法之面向对象
oc的底层是一些c和c++的代码,要搞定底层,还要学习下c++语法,才能看懂底层源码 定义类class Person{ public: int age; float height; float weight; char name[]; string address; } public:表示...
青衣
in
iOS 开发笔记
isa指针探究
有person对象,需要存储是否高富帅,三个变量。通常是这么做的 Person : NSObject (nonatomic,assign,getter=isTail)BOOL tail; (nonatomic,assign,getter=isRich)BOOL rich; (nonatomic,assign,getter=isHandsome)BOOL handsome; 这样会自动生成三...
青衣
in
iOS 开发笔记
查漏补缺之runloop之基本概念
什么是runloop loop就是循环,runloop就是跑着的循环,正在运行的循环。 说起循环,我想到了for循环,while循环,runloop就是一个while循环,是一个终止条件的循环。不是一个死循环。死循环就是没有终止条件...
青衣
in
iOS 开发笔记
查漏补缺之bash和zsh
bash和zsh都是shell, 除此之外还有其他的shell工具 cat /etc/shells terminal和iterm2是搭载shell的工具,terminal上可以使用bash,也可以使用zsh,同样的,iterm2可以使用bash,也可以使用zsh 比如此时我的terminal和iterm2...
青衣
in
iOS 开发笔记
查漏补缺之pod命令
开发中用的比较多的命令是pod install,根据Podfile内容去下载对应的库。pod update用的少一些。有时候会用到pod repo update,这些有啥区别呢,分别是啥意思呢? pod install 根据 Podfile.lock 文件中列举的版本号来...
青衣
in
iOS 开发笔记
pod本地验证通过远程验证不通过
解决 git tag xxx git push --tags 遇到过一次,通过更新tag,之后解决了,然后遇到第二次,果然又是通过更新tag解决了。 查看官方的文档,验证只是本地验证,没有远程验证 也就是说其实本地验证通过了,就可以提交了。 下一步就是 当更新了tag,做远程验证才不会出现问题 pod spec lint比本地验证更加严格,确保你发布的库是OK的,在push之前。你应该验证一下。
青衣
in
iOS 开发笔记
try catch啥时候用?
最近在做sdk这方面的工作。想着要给代码增加一层保护,至少不能让sdk发生崩溃。看到之前的同事是在代码中加入了try,catch。于是考虑给自己的代码也增加try,catch防护。不过基本上没怎么用过。 可是代码这么多,在那些地方增加try catch呢?当然是在可能发生崩溃的地方。但是我如何知道哪里容易发生崩溃呢? 崩溃的种类就那么多种,数组越界,方法找不到,子线程操作ui,字典插入空值,野指针,死锁等等。 只要有这些操作的地方都应该加一层防护。 在开发和测试阶段则尽量少用,以便于将问题暴露出来。上线的时候可以加上防护。
青衣
in
iOS 开发笔记
多线程面试题
问题1 NSLog(@"111"); dispatch_async(dispatch_get_global_queue(0, 0), ^{ [self performSelector(test) withObject:nil afterDelay:0]; }); NSLog(@"222"); - (void)test{ NSLog(@"test"); } 感觉是111,test,222,但是看设置为0,感觉不简单,肯定是11...
青衣
in
iOS 开发笔记
线程组
监听多个异步任务结束,然后再执行一些操作. dispatch_queue_t dispatchQueue = dispatch_queue_create("ted.queue.next", DISPATCH_QUEUE_CONCURRENT); dispatch_group_t dispatchGroup = dispatch_group_create(); dispatch_group_async(dispatchGroup, di...
青衣
in
iOS 开发笔记
信号量
一起使用的有三个函数 dispatch_semaphore_create dispatch_semaphore_wait dispatch_semaphore_signal dispatch_semaphore_create(0)创建一个信号量,传入的值不能小于0 dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);等待一个信号量,如...
青衣
in
iOS 开发笔记
同步,异步,串行,并发,主队列
同步,异步,串行,并发,主队列 同步是同步函数,不具备开启线程能力,要求立刻执行 异步是异步函数,具备开启线程的能力 串行队列,添加其中的任务依次执行 并发队列,可以同时执行多个任务 ...
青衣
in
前端开发笔记
dart的面向对象
类定义的最基本的语法 如果不自定义构造函数,那么系统会提供一个默认的构造函数。 如果提供了自定义的构造函数,那么系统就不会提供默认的构造函数 下面的构造函数是一种语法糖,是注释掉的代...
青衣
in
iOS 开发笔记
结构体内存对齐以及alloc底层探索
结构体内存对齐原则 结构体的第一个成员在偏移量为0的地址处 其他成员放在对齐数的整数倍地址处 对齐数=min(编译器默认对齐数,该数据类型的大小) 如果成员是结构体,对齐到该结构体的最大对齐...
青衣
in
前端开发笔记
手势监听
class MyButton extends StatelessWidget { Widget build(BuildContext context) { return new GestureDetector( onTap: () { print('MyButton was tapped!'); }, onDoubleTap: (){ print('MyButton was DoubleTap!'); }, onHorizon...
青衣
in
前端开发笔记
可水平垂直两个方向滚动的datatable组件
return SingleChildScrollView( scrollDirection: Axis.horizontal, child: SingleChildScrollView( child: DataTable( columns: _createDataColumn(), rows: _createDataRows() ), ), ); .... _createDataC...
青衣
in
前端开发笔记
基础组件学习
基础组件学习文本组件Text只能显示一种样式 return Text( 'Hello, $name! How are you?', textAlign: TextAlign.center, overflow: TextOverflow.ellipsis, style: TextStyle(fontWeight: FontWeight.bold,fontSize: 50) ); 属...
青衣
in
前端开发笔记
flutter示例demo分析
//导入了一个material的库 import 'package:flutter/material.dart'; //程序入口,调用了runApp方法,需要传入一个Widget,此处传入一个MyApp, void main() { runApp(MyApp()); } //MyApp是一个继承自StatelessWidget的无状态组件 class MyApp...
青衣
in
前端开发笔记
初识flutter和环境搭建
跨平台方案 webview react native flutter ## flutter绘制原理 GPU > Dart > Layer tree > Compositor > Skia > GPU ## 帧率与刷新率 帧率: 每秒多少张图片 刷新率:每秒刷新多少次 ## 渲染引擎skia 全称 skia graphics library...
青衣
in
前端开发笔记
路由元信息
matched包含了当前路由记录以及所有的父辈路由记录 今天发现push传参数用name,和path的一点区别 路由配置如下 { path: '/home', component: home, name: 'home', alias: '/abc', children: [ { path: '', component: default...
青衣
in
前端开发笔记
导航守卫
导航守卫,就是路由跳转过程中的一些钩子函数。用于监听导航过程中的各个时间节点,方便我们做相应的处理。 类似于iOS中的生命周期函数。 1.全局的前置路由守卫。 所有路由跳转之前都会调用到这里...
青衣
in
前端开发笔记
history模式
这一节更多的是概念知识。前端路由有两种模式:hash模式和history模式。 1.hash模式 vue router 默认是hash模式,该模式下,url里面会有一个井号 2.history模式 没有井号。 const router = new VueRouter({ mode: 'history', ...
青衣
in
前端开发笔记
vue router 路由组件传参
1. 传布尔值 router-index.js { path: '/user/:id', component: user, props: true} user.vue <template> <div class="appContainer"> 用户主页{{ id }} </div> </template> <script> export default { name: 'User', props: { i...
青衣
in
前端开发笔记
vue router重定向和别名
根路径重定向到登录页面 三种方式 1.字符串{ path: '/', redirect: '/login' }, 2.命名路由{ path: '/', redirect: { name: 'home' }}, 3.函数 { path: '/', redirect: to => { // 方法接收 目标路由 作为参数 // return 重定向的 ...
青衣
in
前端开发笔记
vue router 命名视图
命名视图,我一开始还以为是route配置时候到name,仔细一看,不是那么回事儿,而且有些费解。route的name 是给路由起名字,叫做命名路由。 官方文档中频繁提到到一个概念是,出口。也就是router-view,项目...
青衣
in
前端开发笔记
vue router 命名路由
命名路由,就是给路由一个名字,配置路由到时候,通常会有path,component,这两个是必不可少到,路径以及对应到组件,根据路径匹配对应的组件,将对应的组件渲染出来。 { path: 'profile', component: userprofile, name: 'profile' }, { path: 'posts', component: userposts, name: 'posts' } 跳转路由的时候,通过name可以方便的进行跳转
青衣
in
前端开发笔记
vue router编程式导航
第一次看到router-link的时候感受就很奇怪,因为开发中没有这样用的。开发中用到的更多的是编程式导航。 router-link,更像是a标签,更像是html的做法。用官方的话说,这种叫做声明式导航。 vue-router提供...
青衣
in
前端开发笔记
vue router 嵌套路由
有时候,路由不一定是平级的,而是嵌套的。比如 用户主页下层有用户信息页面,用户文章页面,默认用户页 user -userhome -profile -posts 这时候路由配置就是这样 app.vue <div id="app"> <router-view /> ...
青衣
in
前端开发笔记
vue router动态路由
官方文档讲解动态路由,是多个不同路由参数映射到同一个路由组件。 比如跳转用户页面,用户id不同 const routes = [ { path: '/home', component: home }, { path: '/user/:id', component: user } ] <div> home <el-butt...
青衣
in
前端开发笔记
vue router基本使用
接触前端半年来,4月中旬到11月中旬,半年多了,大部分情况都是写页面,以及页面的逻辑,对于完整对项目没有一个熟悉。这样是不够的。 今天就来学习下vue-router吧。 1. 安装npm install vue-router 然后在ma...
青衣
in
前端开发笔记
更简洁的三目写法
通常三目运算符都是这样写的 let aaa = null let bbb = aaa !== null?aaa:'123' 通过或运算符来写更加简洁 let aaa = null let bbb = aaa || '123'
青衣
in
前端开发笔记
js中枚举的写法
查询条件有一个下拉单选组件,有四个选项:全部,A,B,C,但是这并不和后端逻辑一一对应,A对应1,B对应3,其中C对应的枚举值是2,4,5. 本来直接传字符串就好了 { label: '全部', value:'' }, { label:A value:'1' }, { la...
青衣
in
iOS 开发笔记
一个NSObject对象占用多少内存
一个NSObject对象占用多少内存,可以通过函数打印一下 NSObject *obj = [[NSObject alloc]init]; NSLog(@"%zu", class_getInstanceSize([NSObject class]));//8 printf("%zu", malloc_size((__bridge const void *)(obj)));//16 class_getInstanceSize得到...
青衣
in
iOS 开发笔记
彻底搞懂实例对象&类对象&元类对象
实例对象 通过alloc产生的出来的对象. 实例对象里面包含了 成员变量 没有存储方法,isa是所有实例对象都有的成员变量,因为所有对象都继承 类对象 实例对象的模板,实例对象都是依据类对象创建出来的. t...
青衣
in
iOS 开发笔记
彻底搞懂isa和superclass的作用
实例对象,类对象,元类对象的isa指向 instance的isa指向class class的isa指向meta-class meta-clas的isa指向基类的meta-class 类对象,元类对象的superclass指向 class的superclass指向父类的class 如果没有superclass则指向nil meta-class...
青衣
in
iOS 开发笔记
load底层原理
load方法是在runtime时候调用的. //objc-os.mm _objc_init() load_images() prepare_load_methods() call_load_methods() call_load_methods实现如下 do { // 1. Repeatedly call class +loads until there aren't any more while (loadable_classes_used &...
青衣
in
iOS 开发笔记
.h文件找不到
接手一个别人留下的项目,把代码从SVN上面download下来,编译就不通过,报了莫名其妙的错误,经过一番Google,通过更新pod解决了.然后出现第二个bug,.h文件找不到.从昨天下午到现在,整整特么一天过去了,google了各...
青衣
in
iOS 开发笔记
keychain+uuid解决设备唯一标识符问题
上一文章提到了,从iOS5之后,原生没有真正意义上的设备唯一标识符方案.那么就需要思考一个替代方案. 把获取的UUID通过KeyChain存储起来 在app卸载之后,保存在KeyChain中的数据,还是在的 使用keyChain有一个要...
青衣
in
iOS 开发笔记
APNs
大致原理 推送分两种 本地推送 比如搞一个定时器,几分钟后弹通知,是本地可以控制的 远程推送 这就是从服务器推送过来的消息.是由公司的服务器推送到苹果的服务器,然后苹果的服务器再推送给用户.作...
青衣
in
iOS 开发笔记
UDID和UUID
UDID(Unique Device Identifier)唯一设备标识符,是设备唯一标识符,在iOS5.0之后被苹果废弃了 UUID(Universally Unique IDentifier)通用唯一标识符,不同的应用具有不同的UUID,同一个应用,在卸载之后UUID会发生变化 获取UUID有两...
青衣
in
iOS 开发笔记
类别?分类?类目?扩展?延展?匿名分类?类扩展?
标题写了一大堆,其实只是两个名词的各种叫法category和extension 因为中文名字叫法有很多种,常常让我很懵逼 有必要总结一下 长相上的区别category,被叫做做分类,类别,类目,匿名分类 通常通过如下方式创建一...
青衣
in
iOS 开发笔记
可变数组和不可变数组相互赋值
电话面试的时候问到这个问题,简单记录一下 有两种情况 可变数组赋值给不可变数组 不可变数组赋值给可变数组 我回答的是 因为二者类型不匹配,在编译的时候编译器会报提示.面完验证了一下,发现理...
青衣
in
iOS 开发笔记
Swift中Struct和Class的区别
面试的时候问到了Swift中的Struct和Class的区别,有点蒙. OC中基本上是使用Class,习惯使然,迁移到Swift之后仍旧使用Class作为基本的开发单元,除了知道结构体是基本数据类型,类是对象之外,其他的就不太清楚. 在Sw...
青衣
in
iOS 开发笔记
HTTP中GET和POST有什么区别?
GET是获取数据,参数以明文的方式拼接在URL后面,是不安全的,不会对服务器资源产生影响,是幂等的,不过GET多少次,获取的结果都是一样的 幂等是数学中的术语 比如单目运算中,操作符对操作数进行N次相同操作,结果都是一样的. 双目运算中,两个操作数等值,且运算结果等于这个操作数,则该运算是运算幂等. POST是提交数据,参数存储在Body中,是二进制数据,相对是GET要安全些,POST了一些内容之后,比如新闻页面提交评论,会对服务器资源产生影响,下一次获取的时候服务器的资源发生了变化.
青衣
in
iOS 开发笔记
属性修饰符retain做了什么?
僵尸对象 看一段代码 //Dog.m Dog - (void)dealloc{ NSLog(@"dog---dealloc"); [super dealloc]; } //Person.h #import <Foundation/Foundation.h> Dog; Person : NSObject{ Dog *_dog; } - (void)setDog:(Dog *)dog; - (Dog *)dog; //Person.m #import "Person....
青衣
in
iOS 开发笔记
从内存管理说开
两种内存管理方式 在OC中,内存管理有两种方式 手动引用计数(MRC) 自动引用计数(ARC) 手动引用计数就是,需要开发者自己管理对象的引用计数;自动引用计数,则不需要开发者管理对象的引用计数 #什么是引用...
青衣
in
iOS 开发笔记
KVO的实现原理
说起来KVO,用得并不是很多,用过.K,key,V,value,O,Obeserving,键值观察.当我们试图观察一个属性值的变化,然后采取相应的操作的时候,就可以使用KVO来实现,它比通知更为简单,通知需要自己主动在被监听的对象的值...
青衣
in
iOS 开发笔记
离线H5工程文件应该放在沙盒哪里比较好呢?
项目需要从服务器下载打包好的H5工程文件,以便在没网的时候加载离线HTML.应该放在哪一个目录下比较合适呢? 官方文档还没更新,还是只有三个目录 Documents Library Temp 实际运行已经多了一个文件夹SystemDa...
青衣
in
iOS 开发笔记
在block中使用带下划线的成员变量会导致循环引用
遇到一个循环引用的小问题,通过注释发现是在block中使用了带下划线的成员变量,而没有使用weakSelf访问. [EMOfflineRecordDataBase insertRecord:result callBack:^(BOOL resp,EMData *model) { NSString *r = resp?@"yes":@"no"; ...
青衣
in
iOS 开发笔记
FMDataBase is not open
一开始的时候看到这个方法[set objectForColumnName:@""]猜想直接存储模型不就好了,老大为什么还要费劲的先要归档转成二进制,然后再存,取的时候也是,多麻烦,于是就去验证一下,能不能直接存储模型,然后就报错...
青衣
in
iOS 开发笔记
FMDB使用
一直以来,数据库相关的操作都是复制粘贴老大的代码,这对于我的技术成长没有任何作用,因而,有必要自己来思考一下FMDB数据库的使用.哪怕再简单的使用,也应该认真对待. FMDB使用 学习一个框架最好的方式...
青衣
in
iOS 开发笔记
OC的消息机制
有一个Person类,该类有一个方法eat - (voit)eat{ NSLog("eat"); } 我们通过执行下面的代码就可以打印eat [p eat]; 很简单的就实现的了我们目的,仔细探究,编译器,以及oc的运行时机制其实做了很多操作. [p eat]会调...
青衣
in
iOS 开发笔记
static修饰局部,全局变量
static char kNameKey char kNamekey,声明了一个char 类型的变量,声明变量会在内存中开辟一块存储空间,只是还没有值 修饰局部变量 只初始化一次,相当于生命周期变长了. eg. 不用static修饰的局部变量- (void)touchesBegan...
青衣
in
iOS 开发笔记
关联对象浅析
property做了什么? @property 做了三件事情 生成带下划线的实例变量,getter,setter 在分类中添加property属性则不会自动生成 NSObject (Extension) (nonatomic, copy) NSString *name; 提示如下 使用@dynamic关键字或者在该分类实...
青衣
in
iOS 开发笔记
WKWebView缓存问题(续)
# 缓存问题续 在上一篇文章中,提到精确控制缓存,是从别人的文章上看来的,经过老大一发问,顿时语塞,精确控制用的是NSURLSession的方法,那就意味着不用webView的load系列方法而是用NSURLSession的dataTask将对应的...
青衣
in
iOS 开发笔记
WKWebView的缓存问题
缓存策略 WKWebView提供的实现了的缓存策略 NSURLRequestUseProtocolCachePolicy//默认的缓存策略 NSURLRequestReloadIgnoringCacheData//重新请求忽略缓存 NSURLRequestReturnCacheDataElseLoad//有缓存就返回缓存,没有就请求,需要对缓...
青衣
in
iOS 开发笔记
RxSwift(一)初识Rx
更易阅读,逻辑紧凑的编码方式 看一段代码 let nums = [1,2,3,4,5] let newNums = nums[3..<nums.count].filter({$0%2==0}) print(newNums)//[4] 上述代码可以表述为: 过滤出数组中从第三个元素之后的偶数 更易...
青衣
in
iOS 开发笔记
realm基本使用(GettingStarted)
前言 学习Demo是官方提供Swift版Demo中的第一个GettingStarted.playground 本demo是一个playground,有两个错误: 属性只用了dynamic修饰,前面还需要加上@objc sorted(byProperty: "age")方法换成了sorted(byKeyPath: "age") 相关知识点1....
青衣
in
iOS 开发笔记
videoGravity
项目中有扫码功能,在iPhone4s上存在一个问题.预览图层两侧存在空隙,不是占满屏幕的.如图 属性说明 Indicates how the video is displayed within a player layer’s bounds rect. Options are AVLayerVideoGravityResizeAspect, AVLayerVideoGra...
青衣
in
iOS 开发笔记
translucent, edgesForExtendedLayout, automaticallyAdjustsScr...
前言 在iOS7.0以后,一个带容器视图的控制器的view默认是全屏布局的 - (void)viewDidLoad { [super viewDidLoad]; UIView *subView = [UIView new]; [self.view addSubview:subView]; subView.frame = self.view.bounds; subView.backgroundCol...
Created with Sketch.
top
Created with Sketch.