- 博客(183)
- 资源 (8)
- 收藏
- 关注
原创 iOS开发中使用Masonry布局实现动画原理
一、案例:我们这里初始按钮是一个很小的按钮,点击就不断放大,最大就放大到全屏幕。核心代码如下:@interface TotalUpdateController ()@property (nonatomic, strong) UIView *purpleView;@property (nonatomic, strong) UIView *orangeView;@property (nonatomic, assign) BOOL isExpaned;@end@implementat
2021-03-24 14:52:23
2338
原创 iOS14+中广告标识(idfa)获取方式
1、什么是IDFA假如没有网络身份证,那么每个商家(App)只能基于自己的账号体系标识用户,并记录用户的行为。而有了统一的网络身份证之后,各个商家之间的数据就可以打通了,天猫不仅知道用户A在淘宝系的购物数据,也能了解到该用户在社交网络的行为,以及旅游的喜好,等等。可以想象一下,随着时间的推移,用户在移动端的行为数据越积越多,用户就会变得越来越像透明人,除非换手机,几乎没有任何办法去抵御这个科技带来的负面效应。只有一个例外,苹果!苹果的特立独行体现在诸多方面,用户隐私就是其中之一。IDFA 是
2021-03-17 17:18:31
25023
3
转载 iOS Zombie Objects(僵尸对象)原理探索
1. Zombie Object 有什么用僵尸对象一种用来检测内存错误(EXC_BAD_ACCESS)的对象,它可以捕获任何对尝试访问坏内存的调用。 如果给僵尸对象发送消息时,那么将在运行期间崩溃和输出错误日志。通过日志可以定位到野指针对象调用的方法和类名。2. 如何开启Zombie Object检测在Xcode中设置Edit Scheme -> Diagnostics -> Zombie Objects3. 开启Zombie Object检测后,对象调用dealloc方法会发生
2021-03-15 14:48:36
1831
转载 iOS中为什么必须在主线程操作UI
在开发过程中,我们或多或少会不经意在后台线程中调用了UIKit框架的内容,可能是在网络回调时直接imageView.image = anImage,也有可能是不小心在后台线程中调用了UIApplication.sharedApplication。而这个时候编译器会报出一个runtime错误,我们也会迅速的对其进行修正。但仔细去思考,究竟为什么一定要在主线程操作UI呢?如果在后台线程对UI进行操作会发生什么?在后台线程对UI进行操作不是可以更好的避免卡顿吗?这篇文章就是基于这样一些疑问而产生的。太长
2021-03-01 17:43:52
1020
转载 手撸LRU算法C++实现
LRU 算法就是一种缓存淘汰策略,计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾位置。但问题是,删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留在缓存里,方便之后继续使用。那么,什么样的数据,我们判定为「有用的」的数据呢?LRU 的全称是 Least Recently Used,也就是说我们认为最近使用过的数据应该是是「有用的」,很久都没用过的数据应该是无用的,内存满了就优先删那些很久没用过的数据。举个简单的例子,安卓手机都可以把软件放到后台运行,比如我先后打
2021-02-25 15:27:58
636
2
转载 iOS 图像渲染过程解析
我们先假设这样一个场景:就是点击一个按键,然后实现一张图片的动画移动。场景.gif代码如下:#import "FJFNineViewController.h"@interface FJFNineViewController ()// boxImageView@property (nonatomic, strong) UIImageView *boxImageView;@end@implementation FJFNineViewController- (void)v.
2020-12-31 15:14:48
1122
原创 IOS开发关于容器控制器的一些思考
背景在IOS开发中,容器类视图控制器有UINavigationController、UITabBarController以及UISplitViewcontroller这么三种。当我们自己要去实现一个视图控制器容器的时候,我们需要做以下操作:1、我们需要创建一个subViewController2、调用[self addChildViewController:self.controller1];3、执行[self didMoveToParentViewController:self.con
2020-12-15 21:01:38
429
原创 IOS开发解决线上bug又爱又恨的一天
研究线上bug,bugly地址:https://bugly.qq.com/v2/crash-reporting/crashes/e4cca56be9/520445?pid=2又是潦草的一天,遇到问题没有先猜想(思考)上来就干,最后细节的东西了解了一大堆,毫无作用,到了晚上又过了一遍bugly的流程,5s解决问题,哈哈,我TM有点想笑,一整天干了个蛇啊!下面亲身记录下今天这一天,真TM牛X。早上来到公司,包哥抛给一个线上bug,说了一大堆我也没听,核心就是你看看这是什么造成的,去解决了。我当然也是义无
2020-12-11 21:50:45
710
1
原创 IOS开发底层dealloc释放细节探究
大家都知道ARC后是不能显示地调用dealloc方法,但是可以重载此方法。突然考虑到如果父类有属性需要释放,而子类重写了此方法,且重写子类dealloc时不能调用[super dealloc]会不会把父类的方法覆盖了写了个测试类@interface ClassA:NSObject @end @implementation ClassA-(void)dealloc{ NSLog(@"dealloc ClassA");}@end @interface Class
2020-12-10 17:05:36
1030
转载 KVO底层原理探究
问题iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?) 如何手动触发KVO首先需要了解KVO基本使用,KVO的全称 Key-Value Observing,俗称“键值监听”,可以用于监听某个对象属性值的改变。- (void)viewDidLoad { [super viewDidLoad]; Person *p1 = [[Person alloc] init]; Person *p2 = [[Person alloc] init]; p1.a.
2020-12-10 15:37:17
158
转载 iOS触摸事件全家桶
好奇触摸事件是如何从屏幕转移到APP内的?困惑于Cell怎么突然不能点击了?纠结于如何实现这个奇葩响应需求?亦或是已经被响应链、手势、target-action这一系列响应触摸事件的方式折腾到不会打Hello World?现在 是时候带你上分了~ (强行YY完毕)本文主要讲解iOS触摸事件的一系列机制,涉及的问题大致包括:触摸事件由触屏生成后如何传递到当前应用? 应用接收触摸事件后如何寻找最佳响应者?实现原理? 触摸事件如何沿着响应链流动? 响应链、手势识别器、UIControl之.
2020-12-08 23:31:13
349
转载 iOS底层学习 - 深入RunLoop
RunLoop这个名词对于iOS开发来说应该是一个听腻了的词汇,而且只知其一不知其二,本篇章就来再深入复习一下RunLoopRunLoop简介什么是RunLoop一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出。如果我们需要一个机制,让线程能随时处理事件但并不退出,这种模型通常被称作 Event Loop。 Event Loop 在很多系统和框架里都有实现,比如 Node.js 的事件处理,比如 Windows 程序的消息循环,再比如 OSX/iOS 里的 RunLoop 。实
2020-12-08 17:47:00
461
原创 IOS端骨架屏加载动画的研究以及TABAnimation三方库的研究
1、骨架屏简介:骨架屏 Skeleton Screen Loading 也叫加载占位图,是近年流行的加载控件,通常表现形式是在界面上待加载区域填充灰色的占位图,与线框图的效果非常相似。Skeleton Screen就是在页面数据尚未加载前先给用户展示出页面的大致结构,直到请求数据返回后再渲染页面,补充进需要显示的数据内容。相比于之前的Loading动画,骨架屏页面更容易让用户产生一种错觉,页面快加载完了。优点:预加载界面大致结构,提高用户体验。缺点:对于一些复杂的UI适配难度比较大。.
2020-12-08 15:26:45
2181
原创 crash分析记录
目录由一个问题说起:1、通过设备直接获取崩溃日志2、使用Xcode从设备获取崩溃日志3、dSYM符号集4、利用dSYM解析符号集由一个问题说起:在开发阶段,在使用ucardebug的过程中突然闪退,因为这个时候我的手机是没有处于调试中的,所以xcode不会把奔溃堆栈打出来,但这个奔溃确实是出现了,怎么处理?经过研究,发现此时获取到奔溃信息的途径有这么2种:1、通过设备直接获取崩溃日志1)打开设置->隐私->分析->分析数据,在其中找到你想要的应.
2020-12-07 18:21:02
1144
原创 IOS实现重签名实操
重签是把已发布/未发布的包重新签名为自己的证书和签名,关键就是替换ipa内的证书和描述文件。手动签名可以研读这篇文章----IOS重签名原理主要通过codesign命令完成。值得说明的是:我们要想对ipa进行重签名,那么这个ipa包一定是未被加密过的,如何查看是否被加密过?使用如下命令:因为重签名是替换原有的签名(不了解的可以研读这篇文章:https://blog.youkuaiyun.com/lwb102063/article/details/110661830),所以我么这里需要准备如下文件,来替换原来
2020-12-06 19:58:02
726
原创 获取ipa安装包的最新方式
获取IPA包的之前我们可以借助PP助手来获取越狱或者非越狱后的IPA安装包,但现在PP助手已经凉凉了,不过我们还是有其他的方式可以获取到IPA包的---《Apple Configurator 2》;这款应用我们可以直接在Apple Store上进行下载,https://apps.apple.com/cn/app/apple-configurator-2/id1037126344?mt=12,下面说一下如何获取官方的IPA包:以下步骤为转载内容:原文地址1.首先下载一个《Apple Configu
2020-12-06 16:06:10
30034
6
原创 彻底搞懂IOS签名机制
目录一、加密/解密1、对称加密:2、非对称加密:3、秘钥配送问题解答4、中间人攻击二、数字签名1、单向散列函数2、数字签名三、数字证书一、加密/解密 常见的加密解密算法分为“对称加密”和“非对称加密”两种。1、对称加密: 通信双方共享同一个秘钥,发收信双方要想进行加密通信,都使用这个密钥对数据进行加密和解密。常见的基于“对称密钥”的加密算法主要有DES、3DES(TripleDES)、AES、RC2、RC4、RC5...
2020-12-04 17:41:31
408
转载 Category的本质
iOS底层原理总结 - Category的本质面试题Category的实现原理,以及Category为什么只能加方法不能加属性。 Category中有load方法吗?load方法是什么时候调用的?load 方法能继承吗? load、initialize的区别,以及它们在category重写的时候的调用的次序。Category的本质首先我们写一段简单的代码,之后的分析都基于这段代码。Presen类 // Presen.h#import <Foundation/Found.
2020-12-04 09:09:59
332
转载 探寻Block本质(二)
block对对象变量的捕获block一般使用过程中都是对对象变量的捕获,那么对象变量的捕获同基本数据类型变量相同吗?查看一下代码思考:当在block中访问的为对象类型时,对象什么时候会销毁?typedef void (^Block)(void);int main(int argc, const char * argv[]) { @autoreleasepool { Block block; { Person *pers...
2020-12-02 18:32:49
146
转载 探寻block的本质(一)
面试题block的原理是怎样的?本质是什么? __block的作用是什么?有什么使用注意点? block的属性修饰词为什么是copy?使用block有哪些使用注意? block在修改NSMutableArray,需不需要添加__block?首先对block有一个基本的认识block本质上也是一个oc对象,他内部也有一个isa指针。block是封装了函数调用以及函数调用环境的OC对象。探寻block的本质首先写一个简单的blockint main(int argc, const.
2020-12-02 17:18:14
428
原创 IOS逆向需用到的工具汇总
1、Mac 上自带的一些命令工具file:查看Mach-O的文件类型file 文件路径otool:查看Mach-O特定部分和段的内容otool -L Mach-O文件 # 查看当前 Mach-O 文件的动态链接库。lipo:常用于多架构Mach-O文件的处理查看架构信息:lipo -info 文件路径 导出某种特定架构:lipo 文件路径 -thin 架构类型 -output 输出文件路径 合并多种架构:lipo 文件路径1 文件路径2 -output 输出文件路径2、
2020-12-01 09:53:10
1692
转载 machOView编译源码运行报错解决方案
转载地址:https://www.jianshu.com/p/13133cc0a8fastring can't find1、缺少c++文件 地址 按照说明操作2、target --> build Phases --> Link Binary 添加libc++.tbd3、target --> build setting 按图示设置截屏2020-10-28 17.34.49.pngmacOS no findtarget --> build setting.
2020-11-25 17:16:57
438
原创 探寻Class的本质
iOS底层原理总结 - 探寻Class的本质对小码哥底层班视频学习的总结与记录。面试题部分,通过对面试题的分析探索问题的本质内容。Class的本质我们知道不管是类对象还是元类对象,类型都是Class,class和mete-class的底层都是objc_class结构体的指针,内存中就是结构体,本章来探寻Class的本质。Class objectClass = [NSObject class]; Class objectMetaClass = object_getClass(
2020-11-12 22:58:16
164
原创 探寻OC对象的本质
iOS底层原理总结第一天 - 探寻OC对象的本质对小码哥底层班视频学习的总结与记录。面试题部分,通过对面试题的分析探索问题的本质内容。面试题:一个NSObject对象占用多少内存?探寻OC对象的本质,我们平时编写的Objective-C代码,底层实现其实都是C\C++代码。OC代码的转化过程OC的对象结构都是通过基础C\C++的结构体实现的。我们通过创建OC文件及对象,并将OC文件转化为C++文件来探寻OC对象的本质OC如下代码#import <Fo..
2020-10-09 08:32:08
269
原创 Z字形矩阵打印
在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan)。给定一个n×n的矩阵,Z字形扫描的过程如下图所示: 对于下面的4×4的矩阵, 1 5 3 9 3 7 5 6 9 4 6 4 7 3 1 3 对其进行Z字形扫描后得到长度为16的序列: 1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3问题描述:请实现一个Z字形扫描的程...
2020-03-19 14:43:43
1257
转载 IOS开发底层之Weak底层原理实现
一、weak基本用法weak是弱引用,用weak来修饰、描述所引用对象的计数器并不会加1,而且weak会在引用对象被释放的时候自动置为nil,这也就避免了野指针访问坏内存而引起奔溃的情况,另外weak也可以解决循环引用。拓展:为什么修饰代理使用weak而不是用assign?assign可用来修饰基本数据类型,也可修饰OC的对象,但如果用assign修饰对象类型指向的是一个强指针,当指向...
2020-03-02 21:58:40
467
原创 IOS学习基础UI学习效果动画
这里的效果为个人平时学习总结,有需要的同学可以自行下载弹出式按钮效果图github地址:https://github.com/UCliwenbin/BasicDemo-IOS
2020-01-06 15:04:37
153
原创 IOS中如何限制TextField输入的字符个数(含有中文和英文)
在IOS开发中,TextField可以说是我们最熟悉,也是平时用的最多的控件,其本身的用法比较简单,但是在限制输入上,就会出现一些奇奇怪怪的需求,比如说:不能输入表情,不能输入中文,输入的字符个数不能超过20个…等等,可谓是各种花式需求让我们提到这个控件的时候还是有一丝的心虚。今天正好有空,就来谈谈最近一个比较有趣的需求,需求如下:要求:限制TextField中输入的字符不超过40个,如果是中文...
2019-12-16 23:04:53
1668
原创 IOS开发中使用单元测试(OCUnit)测试集成pod库工程中的一些问题以及解决方案
在写unit test的过程中遇到一些问题,在编译的时候,如果我们代码中引入了pod库头文件或者@import xxx,会提示xx.h file not found方法1:在网上找了半天,说是当测试单元在编译的时候没有包含pod库导致的解决方案:Project=>Info=>Configurations将对应的None改一下;注意:是project...
2019-08-09 15:05:41
1326
原创 微信小程序开发之环境搭建
1、申请网站:https://mp.weixin.qq.com/cgi-bin/wx拖到最后,点击立即前往注册,按照流程进行填写,其中需要注意的地方为红框中标出的邮箱这里如果只有一个邮箱的朋友,我介意你重新申请一个,可以申请163的邮箱,传送门申请成功以后,我们进入邮箱,激活微信小程序的链接。然后通过实名登记,我们就完成了第一步微信开发者账号的注册。2、获取AppID...
2019-05-14 17:52:48
451
原创 IOS开发判断网络连接状态
IOS开发中判断网络连接状态以及网络类型我们主要是借助SystemConfiguration、AFNetworking、Reachability来进行判断,底层用的都是SystemConfiguration框架#import <SystemConfiguration/SCNetworkReachability.h>,第一种,使用原生的SystemConfiguration框架来判断网络...
2018-05-29 09:49:05
5911
转载 __bridge,__bridge_transfer和__bridge_retained详解
Core Foundation 框架Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能。下面列举该框架支持进行管理的数据以及可提供的服务:群体数据类型 (数组、集合等)程序包字符串管理日期和时间管理原始数据块管理偏好管理URL及数据流操作线程和RunLoop端口和soket通讯Core Foun...
2018-05-29 08:14:37
723
原创 IOS用代码绘制一张图片
/ 绘制一张图片UIImage *randomBlockImage(CGFloat sideLength, CGFloat inset){ UIGraphicsBeginImageContext(CGSizeMake(sideLength, sideLength)); CGContextRef context = UIGraphicsGetCurrentContext(); ...
2018-04-25 20:12:53
3666
转载 CGAffineTransform矩阵变换详解
CGAffineTransform定义UIView的transform属性是一个CGAffineTransform类型,用于在二维空间做旋转,缩放和平移。CGAffineTransform是一个可以和二维空间向量(例如CGPoint)做乘法的3X2的矩阵。称为仿射变换,“仿射”的意思是无论变换矩阵用什么值,图层中平行的两条线在变换之后任然保持平行”。官方定义:struct CGAffineTran...
2018-04-24 09:21:39
1469
原创 UITextView去掉单行的边距以及各种坑
self.textView.textContainer.lineFragmentPadding = 0; self.textView.textContainerInset = UIEdgeInsetsZero; 只需要以上两行代码即可。这样我们在UITextView中设置的文字就可以左右两边对齐显示。lineFragmentPading:官方描述:The amount by
2017-12-08 09:36:10
2632
转载 IOS开发之NSDateFormatter处理日期格式详解
在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理。例如://实例化一个NSDateFormatter对象NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];//设定时间格式,这里可以设置成自己需要的格式[dateFormatter setD
2017-11-08 23:26:10
811
转载 iOS的UILabel设置居上对齐,居中对齐,居下对齐
通过重写UILable的方法来实现居上对齐,直接上代码// // myUILabel.h // // // Created by yexiaozi_007 on 3/4/13. // Copyright (c) 2013 yexiaozi_007. All rights reserved. // #import typedef enum {
2017-10-25 14:05:00
1919
转载 sizeThatFits 和 sizeToFit的区别
一 sizeThatFits 和 sizeToFit的区别UIView 有个 sizeToFit 方法来计算 UIView 合适的 bounds.size, 注意 autolayout 约束过的 view 该方法失效.- (void)sizeToFit; // calls sizeThatFits: with current view bounds and change
2017-10-24 15:27:37
1214
原创 IOS开发中利用AudioToolbox播放系统声音
1.AudioToolbox概述通过AudioToolbox框架,可以将短声音注册到system sound服务上,被注册到system sound服务上的声音称之为 system sounds。它必须满足下面几个条件。(1).播放的时间不能超过30秒(2).数据必须是 PCM或者IMA4流格式(3).必须被打包成下面三个格式之一:Core Audio Format (.caf),
2017-10-16 10:15:16
925
原创 IOS获取图片中某个像素点的像素值,包括ARGB的各个值
- (UIColor *) getPixelColorAtLocation:(CGPoint)point { UIColor* color = nil; CGImageRef inImage = self.image.CGImage; // Create off screen bitmap context to draw the image into
2017-10-15 16:05:18
3574
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人