疯狂的石头

  • 首页

  • 归档

  • 分类

iOS多线程

发表于 2018-06-08 | 更新于 2018-06-09 | 分类于 iOS

线程和进程

一般而言进程包含如下3个特征:

  • 独立性:进程是系统中独立存在的实体,拥有自己独立的资源,拥有自己私有的地址空间。在没有进过进程本身允许的情况下,一个用户进程不可以直接访问其他进程的地址空间。

  • 动态性:程序只是一个静态的指令集合,而进程是一个正在系统中活动的指令集合。

  • 并发性:多个进程可以在单个处理器上并发执行,多个进程间不会互相影响。

并发性和并行性是两个概念,并行指在同一时刻有多条指令在多个处理器上同时执行;

并发指在同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行,使得在宏观上具有多个进程同时执行的效果。

阅读全文 »

frame、bounds和center

发表于 2018-06-08 | 更新于 2018-06-09 | 分类于 iOS

frame:该view在父view坐标系统中的位置和大小

bounds:该view在本身坐标系统中的位置和大小

center:该view的中心点在父view坐标系统中的位置和大小

其实本地坐标系统的关键就是要知道他的原点(0, 0)在什么位置(这个位置是相对于上层view的本地坐标系统而言的,最上层view就是window,他的本地坐标系统原点就是屏幕的左上角了)。

通过修改view的bounds属性可以修改本地坐标系统的原点位置,进而影响到“子view”的显示位置。

1
2
3
4
5
6
7
8
UIView *viewA = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 200, 200)];
[viewA setBounds:CGRectMake(-30, -30, 200, 200)];
viewA.backgroundColor = [UIColor redColor];
[self.view addSubview:viewA];

UIView *viewB = [[UIView alloc] initWithFrame:CGRectMake(-10, -10, 100, 100)];
viewB.backgroundColor = [UIColor yellowColor];
[viewA addSubview:viewB];

以上代码运行效果:

bounds和frame的值:

1
2
viewA.frame:{{20, 20}, {200, 200}}, viewA.bounds:{{-30, -30}, {200, 200}}
viewB.frame:{{-10, -10}, {100, 100}}, viewB.bounds:{{0, 0}, {100, 100}}

[viewA setBounds:CGRectMake(-30, -30, 200, 200)]
修改为:
[viewA setBounds:CGRectMake(-30, -30, 245, 245)]
运行效果:

bounds和frame的值:

1
2
viewA.frame:{{-2.5, -2.5}, {245, 245}}, viewA.bounds:{{-30, -30}, {245, 245}}
viewB.frame:{{-10, -10}, {100, 100}}, viewB.bounds:{{0, 0}, {100, 100}}

bounds可以通过修改自己坐标系原点的位置来影响“子view”的显示位置。
bounds可以改变frame,如果bounds比frame大,那么frame也会随之变大。

iOS 界面卡顿及解决方案

发表于 2018-06-08 | 更新于 2018-06-09 | 分类于 iOS

卡顿一般是由于CPU或者GPU没有完成内容提交,以至于那一帧会被丢掉,等待下一次机会再显示,而这时显示屏会保留之前的内容不变。

CPU相关

对象创建

对象的创建会分配内存、调整属性、甚至还有读取文件等操作,比较消耗CPU资源。尽量用轻量的对象代替重量的对象。比如 CALayer比UIView 要轻量许多,如果不需要响应事件,显然用 CALayer 更加合适。如果不涉及UI操作则尽量放到后台线程去创建。通过 Storyboard 创建视图对象时,其资源消耗会比直接通过代码创建对象要大很多。

尽量推迟对象创建时间,并把对象的创建分散到多个任务。如果对象可以复用,尽量这类对象放到缓冲池中。

对象调整

对象的调整也很消耗CPU。比如对UIView的显示相关属性(frame、bounds、transform等)调整、视图层次调整。

阅读全文 »

sizeof 操作符

发表于 2018-06-08 | 更新于 2018-06-09 | 分类于 随笔

定义

sizeof操作符的作用是返回一个对象或类型名的长度,返回值的类型为size_t,长度的单位是字节。sizeof表达式的结果是编译时常量,该操作符有一下三种语法形式:

1
2
3
sizeof(type name);
sizeof(expr);
sizeof expr;

理解

  • 将sizeof用于expo时,并没有计算表达式expr的值。

  • 使用sizeof所得的结果部分的依赖所涉及的类型。

  • 对char类型或值为char类型的表达式做sizeof操作结果为1。

  • 对引用类型做sizeof操作将返回存放此引用类型对象所需的内存空间大小。

  • 对指针做sizeof操作将返回存放指针所需的内存大小。

  • 对数组做sizeof操作等效于将对其元素类型做sizeof操作的结果乘上数组元素的个数。

阅读全文 »

设计模式

发表于 2018-06-08 | 更新于 2018-06-09 | 分类于 随笔

设计模式:是指在软件开发中,经过验证的,用于解决在特定环境下、重复出现的、特定问题的解决方案。

简单工厂(Factory)

提供一个创建对象实例的功能,而无需关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类。

适配器模式(Adapter)

将一个类的接口转换为客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

单例模式(Singleton)

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

工厂方法模式(Factory Method)

定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到其子类。

代理模式(Proxy)

为其它对象提供一种代理,以控制对这个对象的访问。

观察者模式(Observer)

定义对象间的一种一对多的依赖关系。当一个 对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

迭代器模式(Iterator)

提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。

…

123…9
Crazy Stone

Crazy Stone

step by step...

42 日志
9 分类
E-Mail GitHub
© 2018 — 2020 Crazy Stone
由 Hexo 强力驱动
|
主题 — NexT.Pisces