- 博客(22)
- 资源 (24)
- 收藏
- 关注
原创 iOS开发~细聊设计模式
文章目录一、概述二、框架模式,框架,设计模式1.首先搞清楚这三个概念:总结一、概述无论是初出茅庐还是代码老手,平时工作或面试的时候,经常会提到“设计模式”这个词,还记得刚接触iOS还不算入门的时候,第一次给领导汇报工作进度,就把MVC设计模式写在报告里,瞬间感觉自己写的东西好像专业一些了!后来接触项目越来越多,MVC更是耳熟能详,但随着学习积累,突然发现以前学东西不够系统和全面。那么问题第一个问题来了,MVC是不是设计模式?面试中也经常会问,例如:你经...
2020-08-31 13:43:18 680
原创 iOS多线程之线程锁
在多线程开发中,不可忽视的一个问题就是多个线程同时访问同一个资源时,会造成脏数据等预想不到的结果,为了避免这种现象,我们需要在访问资源的时候添加线程锁,来控制访问。添加线程锁的方式在这主要讲三种方式:@synchronized隐式创建锁对象 NSLock GCD的dispatch_semaphore_t信号机制一、@synchronized( )@synchronized()内的对象设定为锁的唯一标识,只有标识相同时,才满足互斥-(void)testSynchronized.
2020-08-28 17:10:23 236
原创 iOS音视频~编码理论详述
一、为什么要进行视频编码未经压缩的视频的数据量巨大,录制一分钟视频, 需要多大的空间来保存了?1> 为了不让用户感受到卡顿效果, 1秒钟之内至少需要16帧画面(正常开发通常会采集30帧),也就是编码设置的fps参数2> 假如该视频是一个1280*720分辨率的视频(正常情况下会比这个大很多)结果:128072016*60≈843.75M一分钟的视频843M,如果保证播放不卡顿,则需要15M/S 的下载速度,如果使用蜂窝网络...结论:1.如此大的传输数据量,现行带宽压力巨
2020-08-26 14:52:53 567
原创 iOS音视频~H264视频硬件编解码说明
一般系统都会提供GPU或者专用处理器来对视频流进行编解码,也就是硬件编码和解码,简称为硬编解码。苹果在iOS 8.0系统之前,没有开放系统的硬件编码解码功能,不过Mac OS系统一直有,被称为Video ToolBox的框架来处理硬件的编码和解码,终于在iOS 8.0后,苹果将该框架引入iOS系统。由此,开发者便可以在iOS里面,调用Video Toolbox框架提供的接口,来对视频进行硬件编解码的工作,为VOIP视频通话,视频流播放等应用的视频编解码提供了便利。(PS:按照苹果WWDC2014 5
2020-08-26 13:11:41 1198
转载 有赞移动 iOS 组件化(模块化)架构设计实践
一、背景业务组件化(或者叫模块化)作为移动端应用架构的主流方式之一,近年来一直是业界积极探索和实践的方向。有赞移动团队自16年起也在不断尝试各种组件化方案,在有赞微信商城,有赞零售,有赞美业等多个应用中进行了实践。我们踩过一些坑,也收获了很多宝贵的经验,并沉淀出 iOS 相关框架Bifrost(雷神里的彩虹桥)。在过程中我们深刻体会到“没有绝对正确的架构,只有最合适的架构”这句话的意义。很多通用方案只是组件化的冰山一角,实际落地过程中还有相当多的东西需要考量。本文并不准备对组件化架构设计方案给出一..
2020-08-26 09:33:18 1063 1
转载 iOS开发~超详细集成 FFmpeg 步骤
概述网上充斥着大量的 iOS FFmpeg 编译的教程,有的时间比较早了,有的很多都没有说详细,或者有个别坑作者没有讲到,有的讲到到了一半,没有例子。所以本人参考了网上的编译FFmpeg教程到集成的很多文章,然后加上本人进行了实际操作,总结出了此篇文章,希望大家如果有用到FFmpeg,以后少走一些坑。此篇文章内容会包含:从新建 iOS 工程 -------> 到调用FFmpeg 命令 -------> 直到运行项目成功的本人实操的所有步骤。目录FFmpeg 简介 FFm
2020-08-26 09:32:40 878
原创 算法(4)数据结构:堆
1.0 问题描述实现数据结构:堆。2.0 问题分析堆一般使用数组来表示,其中某个节点下标i的两个子节点的下标为 2i+1 和 2i+2。堆是一棵完全二叉树。 堆有3种基本操作:创建,插入,删除。 这3种操作都需要通过“调整堆”的方式来实现。调整堆是指,对堆中的某个节点,若它的值和它所有子节点相比,不是最大/最小,那么就需要将最大/最小的元素和当前节点交换,这种操作成为“调整堆”。 创建可以用插入来实现(复杂度O(nlogn)),也可以使用数组直接转换成堆(复杂度O(n))。 假设数组长度
2020-08-26 09:31:18 88
原创 算法(5)哈希表
1.0 问题描述实现数据结构:哈希表。2.0 问题分析哈希表可以看作我们经常使用的字典(swift)或对象(js),可以让一个key&value对一一对应,可以快速根据key找到value。 哈希表内部使用数组实现,我们需要将不论任何类型的key计算出与之一一对应的数字来,数字的大小介于0到数组尺寸之间,这样,我们可以把value直接存储到数组的对应位置。 通过key计算出唯一数字的过程,叫做哈希函数。同一个key每次通过hash函数生成的数字都是相同的。 由于不同的key可能会生
2020-08-26 09:31:07 204
原创 iOS开发~音视频编码
iOS音视频开发涉及的方面比较广泛,一般分为采集、音视频的封装、编码、推流、拉流、解封装、解码、播放等阶段。其中音视频的编码和解码阶段是非常重要的步骤。其中编码分为硬编码和软编码,对应解码分为硬解码和软解码。硬编码硬编码是指使用非CPU进行编码,如显卡GPU、专用的DSP、FPGA、ASIC芯片等。硬编码一般性能高,对CPU没有压力,但是对其他硬件要求较高(如GPU等)。软编码软编码是指使用CPU进行编码,软编码通常使用:ffmpeg+x264。软编码实现直接、简单,参数调整方便,升级易
2020-08-26 09:30:57 498
原创 图像处理库GPUImage简单使用
一、介绍GPUImage是一个基于OpenGL ES 2.0的开源的图像处理库,作者是Brad Larson。GPUImage将OpenGL ES封装为简洁的Objective-C或Swift接口,可以用来给图像、实时相机视频、电影等添加滤镜。二、使用1.导入GPUImage两种方式a.使用cocopods导入platform :ios, '9.0'target 'GPUImageDemo' dopod 'GPUImage'endb.手动导入(1).首先下...
2020-08-26 09:30:47 3775
原创 iOS直播类APP开发流程解析
前言个人认为要想把直播从零开始做出来,绝对是牛逼中的牛逼,大牛中的大牛,因为直播中运用到的技术难点非常之多,视频/音频处理,图形处理,视频/音频压缩,CDN分发,即时通讯等技术,每一个技术都够学几年的。如果你有更好的建议或者对这篇文章有不满的地方, 请联系我, 我会进行修改, 祝大家学习愉快~谢谢~ 一个完整直播APP原理把主播录制的视频,推送到服务器,在由服务器分发给观众观看。推流端(采集、美颜处理、编码、推流)、服务端处理(转码、录制、截图、鉴黄)、播放器(拉流、解码、渲染)、互动系统
2020-08-26 09:30:10 1122
原创 算法(3)简单四则运算
1.0 问题描述实现10以内四则运算(只包含数字,±*/和小括号)2.0 问题分析四则运算使用“后缀表达式”算法来计算,后缀表达式可以无需考虑运算符优先级,直接从左至右依次计算。 问题分解成2部分,一是将“中缀表达式”(我们正常写的四则运算字符串样式,即我们的输入表达式)转为“后缀表达式”;二是使用“后缀表达式”求值。 “中缀表达式”转“后缀表达式”流程: 首先建立一个栈和一个队列,分别为“符号栈”和“结果队列”:“符号栈”用于保存符号,处理符号优先级;“结果队列”用于保存“后缀表达式”
2020-08-25 14:10:26 350
原创 算法(2)KMP算法
1.0 问题描述实现KMP算法查找字符串。2.0 问题分析“KMP算法”是对字符串查找“简单算法”的优化。 字符串查找“简单算法”是源字符串每个字符分别使用匹配串进行匹配,一旦失配,模式串下标归0,源字符串下标加1。 可以很容易计算字符串查找“简单算法”的时间复杂度为O(m*n),其中n表示源字符串长度,m表示匹配串长度。 KMP算法的匹配方式同简单算法的匹配方式相同,只不过在失配的时候,模式串下标不归零,反而会根据模式串自身的重复信息,回归到一个大于0的下标。从而减少匹配次数。 那么失
2020-08-25 14:08:54 162
原创 有趣的斐波那契数列
1.0 问题描述实现斐波那契数列,求第N项的值2.0 问题分析斐波那契数列最简单的方法是使用递归,递归和查表法同时使用,可以降低复杂度。 根据数列特点,同时进行计算的数值其实只有3个,所以可以使用3个变量循环递进计算结果。 3个变量可以简化为2个变量。3.0 代码实现3.1使用swift实现func fbnq(_ n: Int) -> UInt64{ if n < 0 || n > 92 { return 0; } var
2020-08-25 14:07:34 400
原创 iOS应用模块化的思考及落地方案(二)模块化自动构建工具的使用
1.0 iOS模块化中的问题前文已经介绍了模块化的流程及一些常见的问题,我们在这里再次总结一下。在工作中,当我们开始一个新项目的时候,最先考虑的就是模块化工作。模块化工作的想法是很美好的,可是执行过程中会遇到很多的问题,而这些问题可能会让我们在工作中举步维艰。 工具使用问题。iOS的模块化一般会使用cocoapods工具,这个工具很强大,内容也很丰富,我们想要完成模块化工作,需要建立私有库,编写podspec文件,处理资源,编写Podfile文件,建立本地依赖等等。让团队成员每个人都精通这
2020-08-25 14:01:01 162
原创 iOS应用模块化的思考及落地方案(一)模块的划分及模块化工作流程
1.0 什么是模块化很多关于重构及设计模式的介绍中,经常提到的几个词语是复用及解耦。模块化之所以被提出,也更多是为了解决这几个问题。复用可以减少重复造轮子的情况,很容易理解的是,我们经常使用的github上的第三方框架,比如,AFNetworking等,有了这些组件,我们就不需要再写一遍了。解耦可以减少类或文件之间的关联,如果一个类引用了其他10个类,那么当我们看到这个类或修改这个类的时候,我们同时需要关注另外10个类,了解它们与本类的关联情况。如果你的类,没有与其他任何类关联,你在阅读代码
2020-08-25 14:00:30 406
原创 iOS视频开发(四):通俗理解YUV数据
前言系列文章:《iOS视频开发(一):视频采集》《iOS视频开发(二):视频H264硬编码》《iOS视频开发(三):视频H264硬解码》《iOS视频开发(四):通俗理解YUV数据》前面我们已经介绍了在iOS开发中如果调用摄像头进行视频数据的采集和编解码。但折腾了这么多,对于YUV这玩意儿还是不是特别理解。其实在我的个人实践过程中我也一直搞不懂这个YUV,一顿恶补之后,我们来通俗一点地讲YUV这个数据格式。1、YUV & RGB概述2、YUV的采样方式3、YUV的储存方式及常见格式4
2020-08-25 13:36:38 817
原创 iOS视频开发(三):视频H264硬解码
前言系列文章:《iOS视频开发(一):视频采集》《iOS视频开发(二):视频H264硬编码》《iOS视频开发(三):视频H264硬解码》《iOS视频开发(四):通俗理解YUV数据》上一篇《iOS视频开发(二):视频H264硬编码》我们已经学会了如何对视频数据进行H264编码并且了解了H264码流的基本结构。通常我们将视频进行H264编码是为了进行网络传输,如网络直播、视频会议等应用。网络传输相关的知识点较多且杂,这里我们且先不进行深入研究。我们接着讲对于H264数据,我们如何对其进行解码,本文就来讲
2020-08-25 13:35:57 957
原创 iOS视频开发(二):视频H264硬编码
前言系列文章:《iOS视频开发(一):视频采集》《iOS视频开发(二):视频H264硬编码》《iOS视频开发(三):视频H264硬解码》《iOS视频开发(四):通俗理解YUV数据》上一篇《iOS视频开发(一):视频采集》我们已经介绍了如何采集iOS摄像头的视频数据,采集到的原始视频数据量是比较大的,这么大的数据量不利于进行储存或网络传输。于是我们需要对视频数据进行压缩,就像你要向别人传文件时觉得文件太大了,打个rar压缩包再发给对方的道理一样。视频数据的压缩也叫做编码,H264是一种视频编码格式,i
2020-08-25 13:35:11 2082 1
原创 iOS视频开发(一):视频采集
前言系列文章:《iOS视频开发(一):视频采集》《iOS视频开发(二):视频H264硬编码》《iOS视频开发(三):视频H264硬解码》《iOS视频开发(四):通俗理解YUV数据》作为iOS音视频开发之视频开发的第一篇,本文介绍iOS视频采集的相关概念及视频采集的工作原理,后续将对采集后的视频数据进行硬编码、硬解码、播放等流程进行分析讲解。基本概念AVCaptureSession苹果为了管理从摄像头、麦克风等设备捕获到的信息,整了一个叫做AVCaptureSession的东西来对输入和输
2020-08-25 13:34:11 1643
原创 常用的邮箱服务器(SMTP、POP3)地址、端口
sina.com:POP3服务器地址:pop3.sina.com.cn(端口:110)SMTP服务器地址:smtp.sina.com.cn(端口:25)sina.cn:POP3服务器地址:pop3.sina.com(端口:110) ------- > pop.sina.comSMTP服务器地址:smtp.sina.com(端口:25)sinaVIP:POP3服务器:pop3.vip.sina...
2020-08-25 07:13:28 30325
原创 AutoreleasePool 的相关问题
(1)Autoreleasepool的实现原理:以栈为结点,由双向链表的形式合成的数据结构。 与线程一一对应。双向链表(2)@autoReleasePool经过编译器变异后,成为:void * ctx = objc_autoReleasePoolPush(); //ctx 就是哨兵对象所对应的位置。{}对应代码;objc_autoReleasePoolPop(ctx); objc_autoReleasePoolPush(); 的内部实现:调用了c++中的一个结构体:autoRe
2020-08-16 19:25:33 258
总览汇编寄存器,方便记忆和复习。
2020-09-15
程序员健康指南
2017-10-17
bugfree3.0.4
2015-11-24
iPhone6、6P适配Demo
2015-09-02
JavaScriptCoreDemo
2015-03-18
Core Animation(二)动画基础部分
2015-02-09
学习Core Animation例子CADemo1
2015-02-08
Slidingmenu-MenuDemo
2015-01-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人