自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

_

  • 博客(96)
  • 问答 (1)
  • 收藏
  • 关注

原创 iOS:制作pod库

一:前提假如有一个工具,想把它打成 pod 库,提供给其他人使用。那么需要以下过程。首先在GitHub,GetLab或者你们公司的仓库建立一个库。记录下https的地址,并且将这个库clone到本地。二:制作Pod库1:制作podspec准备工作做好后,开始制作 TestPro.podspec假设在桌面文件夹Demo里面有个项目TestPro。cd 到工程的同级目录下。执行命令生成 TestPro.podspec% cd /Users/xxx/Desktop/Demo% pod spe

2021-09-24 17:34:13 648

原创 Mac:小米手机刷机

通过官方的说明,我一步步执行到fastBoot,发现官方提供的解锁工具只有Windows版本所以我。。。进入正题Mac环境小米手机刷机1:在 MAC上先安装 ADB (Android调试桥)刷机需要先安装adb工具,在终端输入brew cask install android-platform-tools如果网络没有问题的话:会出现-----@OB ~ % brew cask install android-platform-tools==> Tapping homebrew/c

2021-01-14 15:12:50 9964 5

原创 Android:常用key

一:Animation<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/decelerate_interpolator" > <translate android:fromYDelta="0" android:toYD

2021-01-07 14:20:27 439

原创 Swift:指针

在swift中,任务所有的指针都是不安全的,所以对指针的使用不是很友好。一:Swift 指针(Pointer)Swift 中一共有 8 种指针类型。不可变指针:UnsafePointerUnsafeRawPointerUnsafeBufferPointerUnsafeRawBufferPointer可变指针:UnsafeMutablePointerUnsafeMutableRawPointerUnsafeMutableBufferPointerUnsafeMutableRawBuff

2021-01-06 11:21:56 226

原创 Android UI (一) : ListView、RecyclerView

大家好,我是OB!这是Android的UI系列之ListView、RecyclerView一:ListView列表布局 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list_view); initData(); ListView lis

2020-12-29 16:17:21 114

原创 Mac:Eclipse配置tomcat、搭建JavaWeb项目

一:安装eclipse去官方下载eclipse,然后点击安装细心的朋友会发现安装后变成了Eclipse Installer点击安装会出现安装真正的Eclipse IDE选择企业版安装,但是可能会出现卡住不动的情况这是由于被墙的原因,此时我们可以 在下载的时候可以选择镜像然后下载下载,然后点击安装,就OK了...

2020-12-18 14:17:04 3042 5

原创 C++:多态virtual虚函数本质

一:什么是多态多态:多种形态!C++ 多态调用成员函数时,根据调用函数的对象类型执行不同的函数。#include <iostream>class Animal {public: int age() { std::cout << "Animal age \n"; return 0; }};class Dog: public Animal {public: int age () { std::cou

2020-12-15 17:22:42 1365

原创 Mac OS中出现:zsh: command not found: flutter

zsh打开电脑执行$ flutter doctor,然后报错 zsh: command not found: flutter我在想这个flutter的环境之前已经配好了,怎么不能用了呢?上网一查,发现说是新版Mac 从bash变成了zsh,shell用到了很多分支,Mac 10.15.4之前默认用的bash,在这之后用的是zsh,所以zsh和bash都属于shell可以查看已安装shell ~ % cat /etc/shells /bin/bash/bin/csh/bin/dash/

2020-12-14 16:13:11 5880 2

原创 汇编(1):基础

汇编基础会涉及到一些计算机的基础知识1:数据总线(Data Bus)是CPU与内存或其他器件之间的数据传送的通道,每条传输线一次只能传输1位二进制数据。数据总线是数据线数量之和。eg: 8根数据线一次可传送一个8位二进制数据(即一个字节)。16根一次能传输两个字节数据总线的宽度决定CPU与其他元器件一次最大传送的数据量;如:32位的CPU一次传输的最大值是2的32次方2:地址总线(Address Bus)CPU是通过地址总线来指定存储单元的。地址总线决定了cpu所能访问的最大内存空间的大小。

2020-11-09 23:04:28 186

原创 JavaScript对象

一:JS对象JavaScript中的所有事物都是对象;JavaScript在ES6之前没有class的概念,之前的js中类是表示不同类型的集合;js对象的几种创建//第一种:直接创建一个实例对象出来,var Person = { name:"ob", age: 25, add : function () { return 25 + 10; }};//第二种:利用Object创建一个对象,这里也是实例对象var dog = new Obje

2020-10-26 15:32:25 1254

原创 Flutter:在Flutter项目中后添加iOS项目

一、在已有的iOS项目中添加Flutter项目现在有一个ios项目,叫做Test_Flutter_s,名字随便取!1:先在桌面创建一个文件夹:Flutter_ios,将ios项目Test_Flutter_s拖入Flutter_ios,然后执行 cd Desktop/my_flutterflutter create --template module my_flutterflutter create会创建一个Flutter项目2: 给TestPro项目添加一个Podfile文件(如果没有就pod

2020-09-21 18:12:36 2856

原创 Flutter开发笔记(三)

一:刷新UI刷新UI的两种情况:进入页面,网络请求,此时没有数据,等待网络返回结果,返回结果前需要loading页面已经渲染完成,只有少数widget需要修改数据数据共享(InheritedWidget)1:FutureBuilderFutureBuilder适用于进入页面,网络请求,此时没有数据,等待网络返回结果,返回结果前需要loading,然后切换到正常的页面//模拟网络请求,延时两秒返回数据Future getData() { return Future.delaye

2020-09-18 18:27:47 139

原创 swift:实例化之init、required、convenience

出现的问题?当我们写实例化方法时,会出现下面的报错。一般出现两个报错信息:super.init' isn't called on all paths before returning from initializer需要调用父类的init方法'required' initializer 'init(coder:)' must be provided by subclass of 'UIView'没有实现父类指定的构造器正确的写法class OBView: UIView {

2020-09-14 18:29:02 3358

原创 Flutter(二):基础语法

Dart和JavaScript的很相似,但是Dart是强类型语言,JavaScript是弱类型语言。一:变量声明1:varvar:可以接收任何类型的变量,但var的变量一旦赋值,类型便会确定,则不能再改变其类型 var i = 100; i = "stt"; //在js中,这样没有问题,但是在Dart中,直接报错 console.log(i);2:dynamic和ObjectObject 是Dart所有对象的根基类,像OC中的NSObject。dynamic是声明变量的关键词,该

2020-09-13 10:31:38 1026

原创 Flutter(一):环境搭建及问题

以下操作都在Mac OS系统下完成!第一次运行兴致勃勃的根据官网介绍的安装,然后运行,点击Run,然后运。。运。。怎么运不起来?问题一:不能选择模拟器?这个时候呢,终端执行$ flutter doctor,然后出现根据提示发现是 Android SDK 的版本问题,然后执行他的提示:$ flutter doctor --android-licenses然后输入一堆yes,最后重启。终于可以运行Android 的模拟器了...

2020-09-10 10:00:55 172

原创 iOS:沙盒之 Documents、Library、tmp、SystemData

iOS APP都有一个存储空间,就是沙盒。APP的沙盒不能相互访问。沙盒根目录结构:Documents、Library、temp、SystemData可通过一下代码查看NSLog(@"path=[%@]",NSHomeDirectory());1:DocumentsDocuments文件夹下面的内容会默认备份到iCloud,通过Wi-Fi每天自动备份。所以不能放大文件(审核的时候可能会被拒)。2:Librarya:CachesiTunes或iCloud不会对其进行备份。如果存储空间过低,

2020-09-08 17:46:31 1021

原创 iOS:App 签名的原理

为什么要签名?先来看看苹果的签名机制是为了做什么。在 iOS 出来之前,在主流操作系统(Mac/Windows/Linux)上开发和运行软件是不需要签名的,软件随便从哪里下载都能运行,导致平台对第三方软件难以控制,盗版流行。苹果希望解决这样的问题,在 iOS 平台对第三方 APP 有绝对的控制权,一定要保证每一个安装到 iOS 上的 APP 都是经过苹果官方允许的,怎样保证呢?就是通过签名机制。数字签名的作用是我对某一份数据打个标记,表示我认可了这份数据(签了个名),然后我发送给其他人,其他人可以知道这

2020-09-08 15:26:13 215

原创 网络:CDN和IDC

一、CDNCDN的本质上是将媒体资源,动静态图片(Flash),HTML,CSS,JS等等内容缓存到距离你更近的IDC,从而让用户进行共享资源,实现缩减站点间的响应时间等等需求,而网游加速器的本质则是通过建立高带宽机房,架设多节点服务器来为用户进行加速CDN分发:让请求端能够更快的访问资源IDC互联网数据中心(Internet Data Center)简称IDC,就是电信部门利用已有的互联网通信线路、带宽资源,建立标准化的电信专业级机房环境,为企业、政府提供服务器托管、租用以及相关增值等方面的全方位

2020-09-02 17:24:01 1036

原创 iOS:IDFV和IDFA

一、 UDID(Unique Device Identifier Description)代码貌似取不到了,只能通过iTunes获取了,证书添加设备号就是这个二、IDFA (Identifier For Advertising)在同一个设备上的所有App都会取到相同的值,是专门给各广告提供商用来追踪用户而设的 NSString *IDFA = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];

2020-09-01 14:54:09 4344

原创 iOS:NSOperation基本使用

NSOperationiOS4推出GCD后,NSOPeration和NSOperationQueue是基于GCD更高一层的封装。所以NSOperation完全地面向对象。比GCD更简单易用、代码可读性也更高。NSOperation和NSOperationQueue分别对应GCD的任务和队列,NSOperation对比GCD会带来一点额外的系统开销,但是Operation操作性更好NSOperation作为一个基类,不能直接创建任务,需要通过他的子类NSInvocationOperation、NSB

2020-08-24 15:01:33 1162

原创 swift:类、结构体、枚举、数组

一、类和结构体Swift中的类和结构体相同点:都拥有属性,方法都能遵守协议,实现拓展不同点:Class可以继承,struct不能class是引用类型,struct是值类型class没有默认的 成员逐一构造器,struct有枚举:也拥有属性,方法,协议,拓展,和结构体一样是值类型,枚举还拥有关联值等特征结构体和类最大的区别就是struct是值类型,class是引用类型。所以他们给变量赋值时,class是增加一个引用,struct是将对象复制一份给变量(这里涉及到swift的 写

2020-08-23 17:57:42 493

原创 swift:optional实现原理及和guard的使用

一、Optional是什么?Optional可选型的意思是:有值得时候就是值本身,无值的时候就是 nil 。有点内置三目运算法的意思。Optional 是 Swift 出的新类型。它的用法很简单:类型 + ? 。比如 :String?、Float?、Int?由于swift是类型安全性的语言,所以nil本身就是一种类型。因此这里的 String? 和 String 是完全不同的两个类型,前者是 String 类型的可选型,后者是 String 类型,观察如下代码:可以发现String类型是不能直接赋

2020-08-22 19:17:20 1519 1

原创 iOS:NSObject对象的内存布局

一、NSObject的底层结构NSObject的底层结构是一个结构体,先来看两个结构体:objc_object是所有结构体的祖先结构体吧,而我们所有NS开头的oc对象都是class,也就是objc_class,objc_class继承自objc_object,对没错C++的结构体可以继承。struct objc_object {private: isa_t isa;public: Class ISA();// ISA() assumes this is NOT a tagged p

2020-08-21 17:29:02 1638

原创 C/C++:结构体在C和C++中的区别

C和C++这两种语言,除了语法上相似,其理念是完全不同的。一个是面向过程,一个是面向对象一、结构体在C和C++中的区别C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能。C++中的struct有以下特性:struct能包含成员函数struct能继承struct能实现多态而C中的struct却不能1:那C++中的struct和class有什么区别最主要的却别是:默认的继承访问权限不同。struct是public的,

2020-08-21 11:18:47 489

原创 iOS:反射机制与kvc

一、kvckvc键值编码:通过Key名直接访问对象的属性,或者给对象的属性赋值。而不需要调用明确的存取方法。这样就可以在运行时动态地访问和修改对象的属性。iOS开发中的黑魔法之一。 Animal *cat= [[Animal alloc] init]; [cat setValue:@"tom" forKey:@"name"];当调用[cat setValue:@"tom" forKey:@"name"];时,底层的执行机制如下:程序优先调用setName:属性

2020-08-20 16:22:46 497

原创 C/C++:与运算、或运算、异或运算、指针

前言忘记进制的同学先看这里:十进制数,没有前缀二进制数,前缀是0b八进制数,前缀是0o十六进制数,前缀是0xlet decimalInteger = 17let binaryInteger = 0b10001 // 二进制的17let octalInteger = 0o21 // 八进制的17let hexadecimalInteger = 0x11 // 十六进制的17一、与运算两个都是1,结果就为1;&运算通常用于二进制取位操作;

2020-08-20 11:06:07 10614

原创 iOS:组件化之Target-Action模式

传统模式的弊端传统模式的组件之间的交互都是#import "HomeVC.h",然后在该页面push或者present,项目小没有问题。但是当项目越来越大,就会发现:模块间相互依赖,耦合严重管理起来很混乱如下图:任何一个模块变动,导致其他依赖该模块的地方需要检查是否要随着变动。那么按照解耦的思想,改成如下这种中心化的方式就会清晰明了但是依然有问题。虽然看起来比刚开始清晰了很多,但是每个组件还是和中间层双向依赖双向依赖:如果首页或者登陆改变,导致依赖这两个模块的中间层可能也需要改

2020-08-18 17:11:55 1577

原创 swift : 枚举

一、swift支持:关联值(传参),静态方法,协议,扩展,泛型枚举基本使用:enum Direction { case Left case Right}let dir = Direction.Right;switch dir {case Direction.Right: print("Right");case Direction.Left: print("left");}枚举值与OC不一样,OC只能是Int,Swift的枚举可以是:整型(Integ

2020-08-17 18:06:47 478

原创 swift

一、值类型和引用类型1:值类型(Value types)每个实例都保留一份独有的数据拷贝,一般以结构体 (struct) 、 枚举(enum) 或者元组(tuple)的形式出现。如下OBAnimal的结构体typedef struct { NSString *name;}OBAnimal;int main(int argc, char * argv[]) { OBAnimal ani1; ani1.name = @"ob"; NSLog(@"%p:%@",&amp

2020-08-13 18:06:45 205

原创 iOS:网络优化

iOS网络优化主要解决两点:服务器压力客户端网络优化、增加用户体验优化的方向主要是:NSURLCache缓存、Last-Modified、ETagDNS解析数据压缩:protobuf,WebPTCP对头阻塞一、NSURLCache缓存和Last-Modified、ETagNSURLCache可以完成大部分的缓存需求,NSURLCache使用前提只能作用于get请求设置NSURLCache:默认512kb的内存缓存空间,以及10MB的磁盘缓存空间 NSURLCache

2020-08-07 18:33:49 746

原创 iOS :NSMutableArray和NSDictionary、NSSet底层原理、NSCache、copy/mutableCopy

一、NSMutableArray底层原理普通c数组,就是一段能被方便读写的连续内存控件。使用一段线性内存空间的一个最明显的缺点是,在下标 0 处插入一个元素时,需要移动其它所有的元素,同样地,假如想要保持相同的内存指针作为首个元素的地址,移除第一个元素需要进行相同的动作NSMutableArray本质是一个对象。它采用了环形缓冲区的结构。在两端插入和删除非常的快。插入头尾只是修改offset指针,如果插入数据到达阀值,一样需要扩容。只有中间插入和删除时,才需要移动较少的内容...

2020-08-07 11:22:20 1298 1

原创 iOS:内存优化思路

内存问题主要包括两个部分常见循环引用导致的内存泄露大量数据加载及使用导致的内存警告内存优化也是注意处理这两个部分1、循环引用循环引用对App有潜在的危害,会使内存消耗过高,性能变差和Crash等,主要从以下几个方面入手Delegate代理要声明为weak,不能用strong。NSTimerRunLoop会强引用target,可以使用weakProxy 消息转发。使用GCD timerBlock_weak 修饰对象C语法,malloc之后调用free二、大量数据加载导致内存暴

2020-08-06 17:57:28 410

原创 ios:Layer 异步绘制

1:layoutSubviews调用时机init不会触发layoutSubviews调用addSubview会触发layoutSubviewsUIView的Frame改变时(frame的值设置前后发生了变化),会触发layoutSubviewsUIScrollView滚动时,UIView的重新布局会触发layoutSubviews直接调用setNeedsLayout 或者layoutIfNeededUILable,UIImageView等有内容物的View,调用sizeToFit方法后,siz

2020-07-31 15:58:02 518

原创 iOS :runtime之关联对象

大家好,我是OB!当我们利用runtime给分类动态添加属性,本质不是给这个对象添加成员变量,而是为这个对象创建一个关联对象,所以在我们objc_setAssociatedObject添加关联对象后,利用runtime的copyIvarList 是可以发现,根本没有创建新的成员变量的。- (void)setName:(NSString *)name { objc_setAssociatedObject(self, "key_name", name, OBJC_ASSOCIATION_COPY_N

2020-07-30 11:23:31 229

原创 算法集合

struct Node { int data; struct Node * next;};struct Node* createLink(int *arr,int len){ struct Node *head = malloc(sizeof(struct Node*)); struct Node *tmp = head; int i = 0; while (i < len) { struct Node * node = mallo

2020-07-29 14:13:07 138

原创 C/C++:二级指针

形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参)void ob_test(int a, char *name){ a = 15; name = "ob";}int main(int argc, char * argv[]) { int a = 10; char *name = "jack"; ob_test(a, name); NSLog(@"a = %d :name = %s",a,na

2020-07-29 11:12:02 191

原创 iOS:响应链和事件传递&图片的解压缩及渲染过程

iOS 响应链和事件传递当我们点击了屏幕发生了什么?两件事,第一找到点击的view(事件传递),第二响应对应的事件(响应链)。一、事件传递发生触摸事件后,系统会将事件加入到UIApplication管理的一个任务队列(比如滑动事件就是多个UIEvent事件,放入一个队列中,取出队列的头部事件进行处理)中,UIApplication将事件传递给UIWindow继续向下分发给UIView。UIView首先做hitTest检测 触摸点是否在自己身上。如果不在,那么继续寻找子视图。以下代码就是hit

2020-07-23 14:45:31 221

原创 iOS:APP启动过程及优化方案

大家好!我是OB!正文开始前,先说说有的没的!一、静态库和动态库静态库动态库格式.a 和 .framework(Mach-O Type为 Static Library).tbd(以前是.dylib) 和 .framework(Mach-O Type为 Dynamic Library)链接时被完整的复制到可执行文件中,多次使用就会多份拷贝不复制,程序运行时由系统动态加载到内存,系统只加载一次,多个程序共用(如系统的UIKit.framework等),节省内存。优

2020-07-22 17:58:19 1223

原创 C/C++基础小知识

1:C++ 的构造函数OBModel ob;会自动调用类OBModel的构造函数;#include <iostream>class OBModel { OBModel();public: int age;};int main(int argc, const char * argv[]) { OBModel ob; //报错,因为声明,c++自动调用构造函数,但是现在构造函数是private,不能被外部访问了 ob.age = 10; std

2020-07-17 17:25:22 256

原创 iOS:对象的alloc&init、ARC中dealloc使用

大家好,我是OB!今天来聊聊alloc&init和dealloc!一、对象的创建:alloc&init执行Cat *cat = [[Cat alloc]init];时,发生了什么?alloc开辟一块内存给对象,让它不释放,并且把地址返回给指针。init对这块内存进行初始化有下面的继承关系:Cat : Animal Animal : NSObject@interface Animal : NSObject@property (nonatomic, strong)NSString

2020-07-16 15:55:20 464

空空如也

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

TA关注的人

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