技术类博客
文章平均质量分 83
爱勤海之旅
编程中充满乐趣,寻找,定位,更改,完成!
展开
-
Apple ID 登录
Apple ID ,苹果登录原创 2022-11-28 17:05:32 · 2658 阅读 · 0 评论 -
iOS - KVC底层应用
之前简单得讲过一些KVC的用法,但是并不能深入理解KVC内部实现及其原理,下面主要讲下KVC的底层原理。取值 valueForKey:在使用KVC取值的时候,使用valueForKey:方法,该方法会返回一个id类型的对象,那么它的内部会怎么处理的呢?现在我们使用该方法: Teacher *teacher = [[Teacher alloc] init]; NSString *...原创 2020-03-28 21:30:19 · 330 阅读 · 0 评论 -
iOS-动态方法决议与消息转发机制
在消息发送机制中我们介绍过,OC是动态语言,对象调用方法其实就是对象接收消息,而消息的发送采用“动态绑定”机制,具体会调用哪个方法直到运行时才确定,然后去执行绑定的代码。绑定的过程:以下面代码为例Person *p = Person.new;[p eat];方法调用时,编译器会底层将之转换成C语言的函数objc_msgSend(p, @selector(eat));,来对p发送消息。消...原创 2019-12-10 15:55:51 · 684 阅读 · 0 评论 -
iOS-类和对象之本质
iOS界比较流行的一句话:万物皆对象!为什么会有这么一个说法呢?难道类(class)也是对象(object)?对象其本质又是什么?这些问题在实际开发中或许遇不到,但当真的涉及到底层的开发,就要面对这些问题。想要透析对象的本质,就要了解运行时(runtime),苹果已经将 Object-C runtime 代码开源了,从:http://opensource.apple.com/source/objc...原创 2019-12-02 18:15:59 · 981 阅读 · 0 评论 -
iOS-消息发送机制
在Object-C中,方法的调用不再理解为对象调用其方法,而是要理解成对象接收消息,消息的发送采用"动态绑定"机制,具体会调用哪个方法直到运行时才能确定,确定后才会去执行绑定的代码。OC调用方法的形式如下:Person *p = Person.new;[p eat];从形式上看调用方法是使用中括号的形式,但是我们知道Object-C是动态语言,当代码执行到该调用的时候,系统到底做了哪些工...原创 2019-12-08 22:30:42 · 1042 阅读 · 0 评论 -
iOS-动态添加方法
动态添加方法可以在动态创建的类中添加也可以在已存在的类中添加,先来看下动态添加方法的定义函数:OBJC_EXPORT BOOLclass_addMethod(Class _Nullable cls, SEL _Nonnull name, IMP _Nonnull imp, const char * _Nullable types) OBJC_AVAI...原创 2019-12-07 15:35:45 · 811 阅读 · 0 评论 -
iOS-动态添加属性
前一章介绍了动态创建类,这章主要讲动态添加属性。一、动态添加实例变量Ivar:通过函数class_addIvar()添加属性,更准确的说是添加成员变量,函数定义如下OBJC_EXPORT BOOLclass_addIvar(Class _Nullable cls, const char * _Nonnull name, size_t size, uint8_t...原创 2019-12-06 11:26:53 · 764 阅读 · 0 评论 -
iOS-动态创建类
在运行时动态创建一个类:导入头文件#import <objc/runtime.h>,动态添加类,创建一个继承 NSString 的类NSStringSubClass类,如下代码: // 类名也可以直接使用C字符串写法 ”NSStringSubClass“ NSString *className = @"NSStringSubClass"; // Cre...原创 2019-12-04 13:20:09 · 1232 阅读 · 0 评论 -
iOS-Masonry实现原理
为视图添加约束的方法有很多,可以使用系统原生的约束方法,即NSLayoutConstraint约束类;可以使用storyboard添加约束;甚至使用CGRectGetMaxY(rect)的若干方法为视图布局。这次我们要说的是使用纯代码添加约束,一个轻量级的第三方约束框架Masonry,作者Jonas Budelmann(乔纳斯·布德曼)很牛匹,相信很多纯代码编程的程序员都用过这个框架,写得很酷,使...原创 2019-11-29 18:41:38 · 1560 阅读 · 0 评论 -
iOS-NSFileHandle和NSFileMange基本用法介绍
利用NSFilehandle类提供的方法,允许更有效地使用文件。一般而言,处理文件时都要经历以下三个步骤:1.打开文件,并获取一个NSFileHandle对象,以便在后面的I/O操作中引用该文件 2.对打开的文件执行I/O操作(读取、写入、更新) 3.关闭文件NSFileHandle和NSFileMange区别NSFileHandle 此类主要是对文件内容进行读取和写入操作(原创 2018-01-15 22:50:06 · 403 阅读 · 0 评论 -
iOS - WKWebView实现JS交互
需求:利用webView加载H5页面,并实现点击H5页面的按钮触发事件,事件是调用OC的方法。简单说就是JS调用OC的方法,这里我们选择的是WKWebView,至于为什么不用UIWebView,自行百度或者看开发文档。实现:1、首先应该倒入 WebKit 框架 #import <WebKit/WebKit.h>2、懒加载一个webView//需要的代理<...原创 2018-05-28 13:58:45 · 896 阅读 · 0 评论 -
iOS - 适配iPhoneX的一些问题
简单说下自己遇到的iPhoneX适配问题首先在宏定义里定义一个IS_IPHONE_X判断是不是iPhoneX,如下:#define IS_IPHONE_X ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen m...原创 2018-05-30 16:52:23 · 2097 阅读 · 0 评论 -
iOS-获取iPhine的(相对)唯一标示
在非越狱的手机上获取某个硬件信息生成唯一标识,第一只能找到苹果的漏洞,第二就是调用一些私有接口,显然这两条路都比较艰难,并不可持续发展,所以网上 大部分的唯一标识都是从操作系统层面获取的,在重置手机系统的时候都会被清除,在系统升级、卸载重装、备份恢复都可以保留,现在本人尚未发现可以使用严格 意义上的唯一标识。接下来我想跟大家探讨的是如何通过“合法”的手段来尽量拿到不会轻易发生变化的“唯一标识”。 ...转载 2018-07-24 14:40:35 · 589 阅读 · 0 评论 -
iOS-APNs在测试环境下可以用,在正式环境下接收不到推送通知
项目需要,本项目集成的推送是小米推送,所有的步骤都是按照小米官网来的,对有点经验的人来说没有什么难度。唯一的可能出问题的地方就是线上环境和测试环境证书的导入。这里文档也有详细的介绍。 现在说说我遇到的问题吧,我使用 Xcode 直接运行安装的应用,然后再小米官网后台模拟发送推送测试,测试环境发送是没问题的,iPhone可以收到消息通知,一切正常,但是当使用线上环境的时候发现收不到消息通知...原创 2018-08-01 15:13:38 · 1798 阅读 · 0 评论 -
iOS - Widget小部件(Today Extension)
Today Extension是iOS8新开放的一种对几个固定系统区域的扩展机制,它可以在一定程度上弥补iOS的沙盒机制对应用间通信的限制,iOS10之后又添加了一些功能。可能好多人不知道或不怎么用Widget。那到底什么小部件呢?看图: 看到这个图你应该就知道Widget这是什么了吧,可能你正在使用它。之后我们研究下面几个问题:1、为什么要使用widget; 2、如何在现有的工程...原创 2018-08-10 11:08:21 · 2948 阅读 · 0 评论 -
iOS - AppStore提交审核因权限申请原因不明被拒
苹果审核有一种被驳回的原因是你申请的权限问题,例如你想打开相机、相册、通讯录、麦克风等等。当你访问的这些的时候,系统会有一个提示框“xxx想访问你的xxx权限”,这个系统提示内容,就是应用被拒的原因。被拒原因:发件人 Apple5. 1.1 Legal: Privacy - Data Collection and StorageGuideline 5.1.1 - Legal - Pri...原创 2018-08-24 13:13:08 · 2854 阅读 · 0 评论 -
iOS-打开本地或下载的Excel文件
刚迭代个项目小功能,打开本地或下载excel文件。打开本地的比较简单,这里只说下载文件并且打开。主要步骤:1.判断沙盒里面是否已经存在了文件,没有就下载,有就打开。2.下载文件,下载完成后打开。下载文件比较简单,封装一个下载的方法:+ (void)downloadExcelFileWithUrlString:(NSString *)urlString filePath:(NSString...原创 2018-11-26 14:26:26 · 4197 阅读 · 0 评论 -
iOS-马甲包是什么意思?如何制作上传?
马甲包的字面意思给产品穿马甲,但是我认为马甲包更像是产品的一种分身,一种和产品一样拥有灵魂,拥有肉身的一种分身。它能为产品带来同样的功能效果。iso马甲包是什么意思?如何制作上传?如图所示,喜马拉雅马甲包一、什么是马甲包马甲包是利用App store 规则漏洞,通过技术手段,多次上架同一款产品的方法。马甲包和主产品包拥有同样的内容和功能,除了icon和应用名称不能完全一致,其他基本一致。...转载 2019-05-28 17:06:06 · 1318 阅读 · 0 评论 -
iOS -UICollectionView添加区头区尾
项目中需求时三个区,没个区展示不同的数据,一格一格的,所以tableView是不是适用的,需要采用collectionView才能更好的展示,那么怎么给它添加区头区尾呢?第一步:需要先注册区头区尾 // 注册区头 [_collectionView registerClass:[CNCollectionReusableHeaderView class] forSupplemen...原创 2018-05-04 13:31:45 · 6706 阅读 · 0 评论 -
C语言-基础知识学习(二)
本节主要讲下C语言中局部变量、全局变量、一维数组以及二维数组。1.局部变量局部变量的初始化:局部变量顾名思义是定义在函数内部的变量,作用域在函数内部,只有在函数内部可访问该变量。初始化方式有两种:一是初始化不赋值 int a; ; 二是初始化赋值: int a=10;注意:在初始化不赋值情况是当我们在栈上分配内存后,这时候的栈顶指针只是往下拨了相应的内存,并没有对内存进行初始化,所...原创 2018-03-29 10:30:27 · 340 阅读 · 0 评论 -
iOS-Base64编码
Base64编码是一种比较常见的一种编码方式。Base64编码原理:Base64编码之所以称为Base64,是因为其使用64个字符来对任意数据进行编码,同理有Base32、Base16编码。标准Base64编码使用的64个字符为:这64个字符是各种字符编码(比如ASCII编码)所使用字符的子集,基本,并且可打印。唯一有点特殊的是最后两个字符,因对最后两个字符的选择不同,Base64转载 2018-01-18 13:06:27 · 468 阅读 · 0 评论 -
iOS-利用终端命令行实现将本地代码上传到GitHub
做iOS开发的朋友们经常会用到终端来下载和管理第三方的类库,那你是不是也想把自己的写的代码上传到Github上面呢,让别人也能够下载你的代码,如果你的代码很好,下载者说不定会给你个star,这会让你很有成就感的哦!!!其实Git的更大作用是团队协同开发(类似于SVN功能),这个功能本节先不讲,下次再讲。本节就来讲下怎么通过终端上传自己的代码到Github,那么常用的命令行必不可少,下面简单介绍原创 2018-01-17 13:01:06 · 2236 阅读 · 0 评论 -
iOS-常见三种加密(MD5、非对称加密,对称加密)
任何应用的开发中安全都是重中之重,在信息交互异常活跃的现在,信息加密技术显得尤为重要。在app应用开发中,我们需要对应用中的多项数据进行加密处理,从而来保证应用上线后的安全性,给用户一个安全保障。 本节只讲原理和应用,具体的代码请到这里下载,都是封装好的工具类,包括终端命令操作。下面介绍常用三种加密。一、哈希HASH1.MD5加密MD5加密的特点:不可逆运算对不同的数据加密的原创 2018-01-18 12:11:26 · 17140 阅读 · 0 评论 -
iOS-删除Storyboard
自从storyboard出现之后,我们每次创建single项目都会自带一个storyboard,但是有些同学不喜欢用它,想把它删掉,采用纯代码布局,下面介绍删掉它需要哪些操作。1.删除设置中的Main Interface内的Main2.删除Main.storyboard3.在AppDelegate 中设置项目的主 windowself.window = [[UIWindow原创 2018-01-25 14:21:38 · 655 阅读 · 0 评论 -
iOS-const的应用
有些同学总是觉得const和宏定义差不多,反正都是定义一个常量,而且好多人习惯用宏定义,难道两者真的一样吗?答案是否定的,const和宏定义还是有些差别的,这次就说下两者的区别。宏定义宏定义属于预编译指令,在程序运行之前已经编译好了的,例如#define username @"xiaoyuzi"如果在程序中有用到username的,那么会在程序运行之前将所有的username替换成原创 2018-01-24 21:21:27 · 1094 阅读 · 0 评论 -
iOS-GPUImage应用
GPUImage 是一个开源的基于GPU的图片或视频的处理框架,由OpenGL ES封装而来,其本身内置了多达120多种常见的滤镜效果,添加实时的滤镜只需要简单地添加几行代码。现在各大直播以及美颜相机等都用到了 GPUImage 框架,想研究的透彻,可以去看他的源码,然后去研究OpenGL ES,然后你发现看不懂OpenGL ES框架,那就对了,它是用C写的,想了解更多就先去看OpenGL,当原创 2018-01-31 15:37:27 · 855 阅读 · 0 评论 -
iOS-AFNetworking实现断点续传功能
上一节说到利用系统原生的方法实现断点续传功能,这次我们说下当下最时尚的第三方网络请求库AFNetworking,利用AFNet实现断点续传。其实原理是和NSURLSessionDataTask一样的。因为我们都知道AFNet在3.0之后是封装的NSURLSession,想知道AFNet3.0和2.0的区别的所以在方法实现上面几本一样。至于AFNet怎么利用CocoaPod获取请移步到这里。方法原创 2018-01-15 22:32:23 · 5202 阅读 · 0 评论 -
iOS-NSURLSessionDataTask实现断点续传功能
平时项目开发中,经常遇到下载视频、语音、图片等等,其中断点续传是最常见的,当然这也是根据产品需求而定的,如果文件很小,就用不到断点,嗖地一下就下载好了。断点续传可以用苹果原生的方法,也可以用AFNetworking。 本节先讲苹果原生的文件下载方法,这里需要了解NSURLSession:一、NSURLSession简介NSURLConnection在iOS9被宣布弃用,NSURLSe原创 2018-01-15 17:43:33 · 2061 阅读 · 1 评论 -
iOS-集成FFmpeg
我们知道2016年被称为直播元年,随着直播的兴起,对视频进行编解码的框架显得尤为重要了,这次主要介绍FFmpeg视频播放器的集成和使用,FFmpeg是视频编解码的利器。视频文件有许多格式,比如 avi, mkv, rmvb, mov, mp4等等,这些被称为容器(Container), 不同的容器格式规定了其中音视频数据的组织方式(也包括其他数据,比如字幕等)。容器中一般会封装有视频和音频轨,原创 2018-01-30 17:44:43 · 466 阅读 · 0 评论 -
iOS-ijkplayer框架的集成
ijkplayer 是一个基于 ffplay 的轻量级 Android/iOS 视频播放器。实现了跨平台功能,API易于集成;编译配置可裁剪,方便控制安装包大小;支持硬件加速解码,更加省电,此方案目前已用于美拍和斗鱼 APP,说明ijkplayer是经得起考验的,当然用第三方SDK是最方便的,如七牛、腾讯、阿里都很好。第一步 :到git上面下载 ijkplayer-master1.手动到g原创 2018-01-30 17:26:49 · 3179 阅读 · 0 评论 -
iOS-Runtime的应用
1.runtime是什么runtime是一套底层的C语言API,包含很多强大实用的C语言数据类型和C语言函数,平时我们编写的OC代码,底层都是基于runtime实现的。2.runtime有什么作用?1.能动态产生一个类,一个成员变量,一个方法 2.能动态修改一个类,一个成员变量,一个方法 3.能动态删除一个类,一个成员变量,一个方法3.常用的头文件#import 包含转载 2018-01-05 16:46:35 · 277 阅读 · 0 评论 -
iOS -KVO和KVC的使用
KVO和KVC可以说是好几年的技术了,之前一直用通知、代理以及Block,发现这几个已经够用了,就没有去仔细的去研究。当然了开发过程中也偶尔用到,那是在遇到困难问题的时候,在网上找的方法里面带有的,在第三方库里面也经常也到,今天有时间就稍微研究下,其实非常简单的,很容易入手应用。一、KVC KVO KVC(Key Value Coding)键值编码,是可以通过对象属性名称(Key)直接给属性原创 2018-01-05 16:15:29 · 412 阅读 · 0 评论 -
iOS-分类(Category)和类扩展(Extension)
一、分类分类(Category)是OC中的特有语法,它是表示一个指向分类的结构体的指针。原则上它只能增加方法,不能增加成员(实例)变量。不清楚怎么创建分类的先看下怎么创建分类,很简单。作用:作用:可以在不修改原来类的基础上,为一个类扩展方法。最主要的用法:给系统自带的类扩展方法。Category源码:CategoryCategory 是表示一个指向分类的结构体的指针原创 2018-01-18 17:18:33 · 573 阅读 · 0 评论 -
iOS-ReactiveObjC响应式编程
RAC 指的就是 RactiveCocoa ,是 Github 的一个开源框架,能够帮我们提供大量方便的事件处理方案,让我们更简单粗暴地去处理事件,现在分为 ReactiveObjC 和 ReactiveSwift ,两个框架的功能使用相似。本人主要是用OC开发,swift开发的不多。我们通常用到的响应式编程方法有哪些?显然最常用的有代理、通知、KVO等等!RAC就是简化封装后响应式编程!原创 2018-01-20 00:09:23 · 866 阅读 · 0 评论 -
ios - 音频AAC解码
上一回说到音频AAC编码,这回我们把编码后的文件解码,解码的文件就是上一章录制的音频。在iOS下进行音频解码及播放的大体流程如下: 1、打开 AAC 文件。 2、获取音频格式信息。如通道数,采样率等。 3、从 AAC 文件中取出一帧 AAC 数据。 4、使用 AudioToolbox 解码 AAC 数据包。 5、将解码后的 PCM 数据送给 AudioUnit 播放声音。 6、重复...原创 2018-03-28 14:44:35 · 3124 阅读 · 1 评论 -
iOS - 音频AAC编码
开发中通常会遇到的音频流的处理,我们知道从苹果设备麦克风上面获取的声音是驳杂的,我们利用原生框架<AVFoundation/AVFoundation.h>可以把音频源经过PCM编码后得到音频裸流,这个音频流理论上你也可以在网络上传输(推流),但是这个裸流内容量太大,不仅传输慢,而且服务器承受不了。这时候我们就需要将其编码,进而引入AAC高级音频编码!1、PCM编码通常我们采用的...原创 2018-03-28 14:17:51 · 3947 阅读 · 1 评论 -
iOS-开辟子线程(NSThread、NSOperationQueue、GCD)
本节主要总结一些开辟子线程的常用的几种方法。一、通过NSThread类开辟子线程1.NSThread手动开启子线程// 创建线程对象.NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(eat) object:nil];thread.name = @"a";// 手动开启线程...原创 2018-02-23 16:03:38 · 6256 阅读 · 1 评论 -
iOS-延时执行常见的几种方法
本节主要介绍几种我们通常用到的实现延时的方法。延时方法我们统一调用- (void)delayMethod- (void)delayMethod{ NSLog(@"delayMethodEnd = %@",[NSThread currentThread]);}1.performSelector方法该方法也是在主线程中执行的方法,同NSTimer一样,不会阻塞主线程。...原创 2018-02-23 10:37:22 · 4413 阅读 · 0 评论 -
iOS-单元测试/性能测试
测试在项目开发中是至关重要的一环,大公司一般会有测试小组,专门进行各种测试;一些小的公司可能没有测试组,这时程序猿自身测试就显得尤为重要了,这里就讲下单元测试即 Unit Tests。1.什么是软件测试、单元测试具体概念这里可以到维基百科英文版 2.一般在创建项目时会勾选 Include Unit Tests点击UnitTestTests.m,可看到测试相应的方法...原创 2018-02-22 17:16:06 · 587 阅读 · 0 评论 -
iOS-UI测试
上一节讲了单元测试,本节简单的讲下UI测试即 UITest。在项目开的发的时候页面上可能会有大量的控件导致滑动卡顿,导致用体验下降,这里用UI测试来j尽量避免这种情况。1.创建项目的时候勾选 Include UI Tests 2.进入UnitTestUITestsUI测试类里面看到有几个方法- (void)setUp { [super setUp]; // 每次...原创 2018-02-22 17:52:10 · 568 阅读 · 0 评论