- 博客(24)
- 资源 (1)
- 收藏
- 关注
原创 OC底层原理-Block
对于block,在日常开发中经常会用到,但有时候会出现一些奇奇怪怪的问题,比如block的里面值没更新上,又比如block里面要改变一个外部变量的值,就得加上__block,不然编译器就会报错。那么,这次就来一次过搞清楚block背后不为人知的真相。Block的基本结构void blockTest(){ void (^block)(void) = ^{ NSLog(@"Hello World!"); }; block();}int main(int a
2022-01-04 23:19:08
1464
原创 iOS离屏渲染
界面渲染UIView继承自UIResponder,可以处理系统传递过来的事件,如:UIApplication、UIViewController、UIView,以及所有从UIView派生出来的UIKit类。每个UIView内部都有一个CALayer提供内容的绘制和显示,并且作为内部RootLayer的代理视图。下图为CALayer的结构图:RunLoop有一个60fps的回调,即每16.7ms绘制一次屏幕,所以view的绘制必须在这个时间内完成,view内容的绘制是CPU的工作,然后把绘制的内容交给G
2021-12-25 22:08:38
2082
原创 内存对齐原理
字节对齐算法先了解一下字节对齐算法static inline size_t word_align(size_t x) { return (x + WORD_MASK) & ~WORD_MASK;}以传入的参数为11为例,先来计算一下结果(11+ 7)& ~7= (00001011 + 000001111) & (11111000)= 00010010 & 11111000= 00010000= 16...
2021-12-07 00:03:48
265
原创 OC底层原理-alloc流程
alloc流程分析可以通过opensource下载objc4来查看alloc的源码,这里用objc4-818版本来分析1.alloc+ (id)alloc { return _objc_rootAlloc(self);}2.objc_allocid objc_alloc(Class cls){ return callAlloc(cls, true/*checkNil*/, false/*allocWithZone*/);}3.callAllocstatic ALWAY
2021-11-13 18:33:04
1646
原创 iOS CATiledLayer大图加载
ios CATiledLayer大图加载内存暴增以一张加载一张7033 × 10110的图片为例,解压缩生成的bitmap可高达7033101104/1024/1024 = 271M。如果直接用UIKit-setImage方法对ImageView.image赋值,app占用内存会由60多MB激增到323MB。CATiledLayerCATiledLayer是继承于CALayer的方片图层,可以利用其对图片进行分片绘制。@interface YPLargeImageView(){
2021-09-06 16:36:53
955
原创 ios内存概述
iOS内存管理在iOS中内存分为五大区域:栈去、堆区、全局区、常量区、代码区栈内存1、高地址向低地址扩展。2、一块连续的内存区域,遵循先进后出的原则。3、运行时分配,在iOS中以0x7开头4、由编译器自动分配并释放5、局部变量、函数参数堆内存1、低地址向高地址扩展2、不连续的内存区域,类似于链表,遵循先进先出的原则。3、运行时分配的,在iOS中以0x6开头4、程序员动态分配和释放的5、访问堆中内存时,一般需要通过对象读取到栈区的指针地址,然后通过指针地址访问堆区全局区
2021-09-05 22:46:12
335
原创 UIViewController的生命周期
1、UIViewController有自己的生命周期,因为UIViewController是ios的重要组成部分,所以了解其生命周期就显得尤为重要了。// 非storyBoard(xib或非xib)都走这个方法- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {...
2019-06-18 20:01:14
839
原创 CALayer图层
图层CALayer与UIView息息相关,在UI上可实现形状定义、绘图、背景定义等操作1、定义图层属性CALayer *layer = [CALayer layer];layer.backgroundColor = [UIColor blueColor].CGColor;layer.bounds = CGRectMake(50, 0, 200, 200);layer.position =...
2019-06-18 19:28:40
150
原创 IOS多线程之NSThread
NSThread如果GCD是面对任务队列来操作多线程,那么NSThread就是直接面对面对线程来实现多线程的了。 NSThread生成线程有以下两种方法: - 子线程 :除了主线程以外的线程。可在后台执行耗时操作,如网络请求,逻辑数据处理等。 - NSRunLoop:点击这里。 - ...
2018-09-07 17:19:03
213
原创 ios多线程之GCD
程序编写往往都会涉及多线程编程,ios也不例外。多线程能够在后台执行耗时操作,优化用户体验,提高程序运行效率。多线程相关概念进程:可以理解成一个运行中的应用程序,是系统进行资源分配和调度的基本单位,是操作系统结构的基础,主要管理资源。线程:组成进程的基本执行单元,一个进程由多个线程组成。主线程:更新UI的操作都在主线程处理,为的是保证线程安全。假如两个子线程同时去同时设置控件图片...
2018-09-07 10:44:04
189
原创 Objective-C Runtime 介绍
Objective-C Runtime最近项目里面有需要屏蔽系统弹出的alertController,上网找了一下方法,发现OC有Runtime的方法可以实现,后来就研究了一下Runtime,在此做一下总结。既然不知道Runtime是究竟个什么东东,那照惯例先从苹果的开发文档下手。 Overview The Objective-C runtime is a runtime...
2018-08-30 15:00:31
406
原创 详解Class和MetaClass
想必对象大家都清楚(不是恋爱对象哦~),那么Class又是什么?这中文意思大家都是知道是“类”,可为什么偏偏就有这么一个结构体叫Class?Objective-C Runtime里面有个api: id objc_getMetaClass(const char *name),这个MetaClass又是个什么鬼?它究竟和Class有什么关系?这一切的背后究竟是究竟是人性的扭曲还是。。。。咳咳,扯远了~...
2018-08-30 14:42:10
5362
原创 使用SurfaceView绘图
Surface的介绍:我们可以自定义View,重写onDraw利用canvas进行绘图。但是,onDraw不能执行太耗时的操作,View是通过刷新来重绘视图的,刷新的间隔是16ms,所以在16ms要执行完绘图操作,不然就会出现卡顿。为了解决这一问题,Android提供了SurfaceView来解决这个问题。它与View的区别主要有以下几点:
2016-08-23 11:40:06
1499
原创 Android性能优化之:内存优化
为何要内存优化? 智能手机会有自己的内存,像电脑内存一样,用来装载要运行的程序。虽说现在的手机动辄都能有1GB或2GB的内存,但是毕竟Android系统允许每个APP占用的内存是有限的,否则内存满了会触发OOM,即Out
2016-08-15 19:02:56
335
原创 Android性能优化之:加载Bitmap优化
1.加载Bitmap首先说一下如何加载一个Bitmap,BitmapFactory提供四类方法:decodeFile、decodeResourse、decodeStream和decodeByteArray,分别是从文件系统、资源、输入流以及字节数组中加载出一个对象。2.BitmapFactory.Options我们可以通过BitmapFactory.Options可以缩放图片,
2016-08-01 11:14:42
1422
原创 通用于ListView的Adapter
在开发的时候,经常会用到ListView,用到ListView就要写对应的Adapter,还要写对应的ViewHolder,那么一整个项目下来,基本上都花了很多时间来写这些东西,所以,上网找了下,学着用别人写的一些通用的Adapter和ViewHolder,高度封装,扩展性强。1.先写MyViewHolder:package com.hvgroup.vgopapp.ui.widge
2016-07-29 14:04:12
255
原创 通过html解析网页数据
最近遇到一个工作需要从新浪财经网页拉取某支股票的当天成交明细,于是乎发现了一个好用的第三方包,在这里跟大家分享一下。这个包叫Jsoup包,jsoup是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。jar包(点击下载)中文api文档(点击查看)接下就来通过我这个项目来说明一下如何解析html1.分析相应的html代码。我要拉取的网页是ht
2016-07-28 14:30:34
4810
1
原创 OkHttp的使用
最近使用了第三方包OKHttp来进行网络请求,感觉挺好用,响应速度也很快。jar包(点击下载)github源码(点击下载)官网介绍(点击下载)而我用Android Studio,可以直接在gradle里面加上依赖:compile 'com.squareup.okhttp:okhttp:2.4.0'compile 'com.squareup.okio:okio:1.
2016-07-28 11:05:16
771
原创 Android性能优化之:绘制优化
绘制优化是指View的onDraw方法要避免执行大量的操作,主要是以下两个方面:1.onDraw中不要创建新的局部对象,因为onDraw可能频繁的调用,短时间内就会产生大量的临时变量,这样不仅占用过多的内存而且还会使得系统不断的进行垃圾回收,降低了程序的效率。2.onDraw方法不要做耗时操作,也不能执行上千次上万次的循环,因为大量的循环会十分抢占CPU的时间片,这会造成V
2016-07-19 21:20:19
434
原创 EditText设置光标的位置和字符选择
EditText可以通过方法setSelection(int index)方法设置光标的位置,如下:((EditText) findViewById(R.id.editText)).setSelection(5);另外,还有一个方法setSelection(int start , int stop)来对字符进行选择,如下:((EditText)findViewById(
2016-07-19 21:08:45
1227
原创 Android性能优化之:布局优化
布局优化的思想很简单,就是尽量减少布文件的层级,这样Android绘制时的工作量就少了,程序性能也随之提高。一、删除无用的控件和层级,有选择性地使用性能较高的ViewGroup如果RelativeLayout和LinearLayout都能实现的布局,应优先使用LinearLayout,因为RelativeLayout的功能比较复杂,布局过程话费更多的CPU时间。FrameLayout也
2016-07-19 15:31:59
254
原创 隐藏键盘
如果输入法的键盘挡住了要显示的区域,可以调用这样一个方法隐藏键盘,参数是要显示的View:public static void hideKeyboard(View v) { InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE
2016-07-19 09:42:03
287
原创 HorizontalScrollView作为导航栏和HorizontalScrollView的滑动
HorizantalScrollView和ScrollView差不多,不过就是滑动的方向是水平方向上的,可以做APP的分类导航栏,就比如下图: 但是呢,导航栏不只是“推荐”、“体育”、“文艺”、“娱乐”这五个分类,在“娱乐”的右边还有3噶分类,只是没显示出来出来而已。下面分类的具体内容用的是ViewPager,翻页的时候分类名称下那条红色的线条也会跟着移动到相应的分类名称下,就像是这样(这是翻页
2016-07-18 16:30:32
3784
原创 使用下拉刷新的和上拉刷新的ListView
首先在Android Studio工程里面import进去一个module,是一个从github上面下载回来的library,网址是https://github.com/chrisbanes/Android-PullToRefresh,只需要下载library文件夹,我是直接用别人开源的写好的代码。 然后,在布局文件里面像原生里的ListView一样用上这个PullToRefreshListVi
2016-07-12 17:05:09
893
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人