IOS开发
文章平均质量分 90
铭记_
如果你发现了通向成功的道路,那么请不要放弃!!
展开
-
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 · 2134 阅读 · 0 评论 -
iOS14+中广告标识(idfa)获取方式
1、什么是IDFA假如没有网络身份证,那么每个商家(App)只能基于自己的账号体系标识用户,并记录用户的行为。而有了统一的网络身份证之后,各个商家之间的数据就可以打通了,天猫不仅知道用户A在淘宝系的购物数据,也能了解到该用户在社交网络的行为,以及旅游的喜好,等等。可以想象一下,随着时间的推移,用户在移动端的行为数据越积越多,用户就会变得越来越像透明人,除非换手机,几乎没有任何办法去抵御这个科技带来的负面效应。只有一个例外,苹果!苹果的特立独行体现在诸多方面,用户隐私就是其中之一。IDFA 是原创 2021-03-17 17:18:31 · 23190 阅读 · 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 · 1656 阅读 · 0 评论 -
iOS中为什么必须在主线程操作UI
在开发过程中,我们或多或少会不经意在后台线程中调用了UIKit框架的内容,可能是在网络回调时直接imageView.image = anImage,也有可能是不小心在后台线程中调用了UIApplication.sharedApplication。而这个时候编译器会报出一个runtime错误,我们也会迅速的对其进行修正。但仔细去思考,究竟为什么一定要在主线程操作UI呢?如果在后台线程对UI进行操作会发生什么?在后台线程对UI进行操作不是可以更好的避免卡顿吗?这篇文章就是基于这样一些疑问而产生的。太长转载 2021-03-01 17:43:52 · 960 阅读 · 0 评论 -
iOS 图像渲染过程解析
我们先假设这样一个场景:就是点击一个按键,然后实现一张图片的动画移动。场景.gif代码如下:#import "FJFNineViewController.h"@interface FJFNineViewController ()// boxImageView@property (nonatomic, strong) UIImageView *boxImageView;@end@implementation FJFNineViewController- (void)v.转载 2020-12-31 15:14:48 · 1077 阅读 · 0 评论 -
IOS开发关于容器控制器的一些思考
背景在IOS开发中,容器类视图控制器有UINavigationController、UITabBarController以及UISplitViewcontroller这么三种。当我们自己要去实现一个视图控制器容器的时候,我们需要做以下操作:1、我们需要创建一个subViewController2、调用[self addChildViewController:self.controller1];3、执行[self didMoveToParentViewController:self.con原创 2020-12-15 21:01:38 · 376 阅读 · 0 评论 -
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 · 636 阅读 · 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 · 891 阅读 · 0 评论 -
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 · 131 阅读 · 0 评论 -
iOS触摸事件全家桶
好奇触摸事件是如何从屏幕转移到APP内的?困惑于Cell怎么突然不能点击了?纠结于如何实现这个奇葩响应需求?亦或是已经被响应链、手势、target-action这一系列响应触摸事件的方式折腾到不会打Hello World?现在 是时候带你上分了~ (强行YY完毕)本文主要讲解iOS触摸事件的一系列机制,涉及的问题大致包括:触摸事件由触屏生成后如何传递到当前应用? 应用接收触摸事件后如何寻找最佳响应者?实现原理? 触摸事件如何沿着响应链流动? 响应链、手势识别器、UIControl之.转载 2020-12-08 23:31:13 · 291 阅读 · 0 评论 -
iOS底层学习 - 深入RunLoop
RunLoop这个名词对于iOS开发来说应该是一个听腻了的词汇,而且只知其一不知其二,本篇章就来再深入复习一下RunLoopRunLoop简介什么是RunLoop一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出。如果我们需要一个机制,让线程能随时处理事件但并不退出,这种模型通常被称作 Event Loop。 Event Loop 在很多系统和框架里都有实现,比如 Node.js 的事件处理,比如 Windows 程序的消息循环,再比如 OSX/iOS 里的 RunLoop 。实转载 2020-12-08 17:47:00 · 411 阅读 · 0 评论 -
IOS端骨架屏加载动画的研究以及TABAnimation三方库的研究
1、骨架屏简介:骨架屏 Skeleton Screen Loading 也叫加载占位图,是近年流行的加载控件,通常表现形式是在界面上待加载区域填充灰色的占位图,与线框图的效果非常相似。Skeleton Screen就是在页面数据尚未加载前先给用户展示出页面的大致结构,直到请求数据返回后再渲染页面,补充进需要显示的数据内容。相比于之前的Loading动画,骨架屏页面更容易让用户产生一种错觉,页面快加载完了。优点:预加载界面大致结构,提高用户体验。缺点:对于一些复杂的UI适配难度比较大。.原创 2020-12-08 15:26:45 · 2047 阅读 · 0 评论 -
crash分析记录
目录由一个问题说起:1、通过设备直接获取崩溃日志2、使用Xcode从设备获取崩溃日志3、dSYM符号集4、利用dSYM解析符号集由一个问题说起:在开发阶段,在使用ucardebug的过程中突然闪退,因为这个时候我的手机是没有处于调试中的,所以xcode不会把奔溃堆栈打出来,但这个奔溃确实是出现了,怎么处理?经过研究,发现此时获取到奔溃信息的途径有这么2种:1、通过设备直接获取崩溃日志1)打开设置->隐私->分析->分析数据,在其中找到你想要的应.原创 2020-12-07 18:21:02 · 1066 阅读 · 0 评论 -
IOS实现重签名实操
重签是把已发布/未发布的包重新签名为自己的证书和签名,关键就是替换ipa内的证书和描述文件。手动签名可以研读这篇文章----IOS重签名原理主要通过codesign命令完成。值得说明的是:我们要想对ipa进行重签名,那么这个ipa包一定是未被加密过的,如何查看是否被加密过?使用如下命令:因为重签名是替换原有的签名(不了解的可以研读这篇文章:https://blog.csdn.net/lwb102063/article/details/110661830),所以我么这里需要准备如下文件,来替换原来原创 2020-12-06 19:58:02 · 668 阅读 · 0 评论 -
获取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 · 28976 阅读 · 6 评论 -
IOS开发底层之Weak底层原理实现
一、weak基本用法weak是弱引用,用weak来修饰、描述所引用对象的计数器并不会加1,而且weak会在引用对象被释放的时候自动置为nil,这也就避免了野指针访问坏内存而引起奔溃的情况,另外weak也可以解决循环引用。拓展:为什么修饰代理使用weak而不是用assign?assign可用来修饰基本数据类型,也可修饰OC的对象,但如果用assign修饰对象类型指向的是一个强指针,当指向...转载 2020-03-02 21:58:40 · 430 阅读 · 0 评论 -
IOS学习基础UI学习效果动画
这里的效果为个人平时学习总结,有需要的同学可以自行下载弹出式按钮效果图github地址:https://github.com/UCliwenbin/BasicDemo-IOS原创 2020-01-06 15:04:37 · 140 阅读 · 0 评论 -
IOS中如何限制TextField输入的字符个数(含有中文和英文)
在IOS开发中,TextField可以说是我们最熟悉,也是平时用的最多的控件,其本身的用法比较简单,但是在限制输入上,就会出现一些奇奇怪怪的需求,比如说:不能输入表情,不能输入中文,输入的字符个数不能超过20个…等等,可谓是各种花式需求让我们提到这个控件的时候还是有一丝的心虚。今天正好有空,就来谈谈最近一个比较有趣的需求,需求如下:要求:限制TextField中输入的字符不超过40个,如果是中文...原创 2019-12-16 23:04:53 · 1564 阅读 · 0 评论 -
IOS开发第三天-内存管理2
自动释放池为了保证函数、方法返回的对象不回在被返回之前就被销毁,需要保证被函数、方法返回的对象能被延迟销毁。有两种方法来达到这个效果:程序每次获取并使用完其他方法、函数返回的对象之后,立即调用该对象的release方法将函数、方法返回对象的引用计数-1.使用自动释放池进行延迟销毁。自动释放池:是指它是一个存放对象的容器(比如集合),而自动释放池会保证延迟释放该池中所有的对象。出原创 2017-04-13 09:44:14 · 334 阅读 · 0 评论 -
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 · 891 阅读 · 0 评论 -
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 · 1819 阅读 · 0 评论 -
UITextView去掉单行的边距以及各种坑
self.textView.textContainer.lineFragmentPadding = 0; self.textView.textContainerInset = UIEdgeInsetsZero; 只需要以上两行代码即可。这样我们在UITextView中设置的文字就可以左右两边对齐显示。lineFragmentPading:官方描述:The amount by原创 2017-12-08 09:36:10 · 2539 阅读 · 0 评论 -
CGAffineTransform矩阵变换详解
CGAffineTransform定义UIView的transform属性是一个CGAffineTransform类型,用于在二维空间做旋转,缩放和平移。CGAffineTransform是一个可以和二维空间向量(例如CGPoint)做乘法的3X2的矩阵。称为仿射变换,“仿射”的意思是无论变换矩阵用什么值,图层中平行的两条线在变换之后任然保持平行”。官方定义:struct CGAffineTran...转载 2018-04-24 09:21:39 · 1408 阅读 · 0 评论 -
IOS用代码绘制一张图片
/ 绘制一张图片UIImage *randomBlockImage(CGFloat sideLength, CGFloat inset){ UIGraphicsBeginImageContext(CGSizeMake(sideLength, sideLength)); CGContextRef context = UIGraphicsGetCurrentContext(); ...原创 2018-04-25 20:12:53 · 3626 阅读 · 0 评论 -
__bridge,__bridge_transfer和__bridge_retained详解
Core Foundation 框架Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能。下面列举该框架支持进行管理的数据以及可提供的服务:群体数据类型 (数组、集合等)程序包字符串管理日期和时间管理原始数据块管理偏好管理URL及数据流操作线程和RunLoop端口和soket通讯Core Foun...转载 2018-05-29 08:14:37 · 679 阅读 · 0 评论 -
IOS开发判断网络连接状态
IOS开发中判断网络连接状态以及网络类型我们主要是借助SystemConfiguration、AFNetworking、Reachability来进行判断,底层用的都是SystemConfiguration框架#import <SystemConfiguration/SCNetworkReachability.h>,第一种,使用原生的SystemConfiguration框架来判断网络...原创 2018-05-29 09:49:05 · 5720 阅读 · 0 评论 -
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 · 1256 阅读 · 0 评论 -
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 · 1185 阅读 · 0 评论 -
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 · 3527 阅读 · 0 评论 -
IOS开发中Category中动态添加属性
@interface UIView (MotionEffectExtends)@property (nonatomic, strong) UIMotionEffectGroup *effectGroup; //动态添加的属性- (void)addXAxisWithValue:(CGFloat)xValue YAxisWithValue:(CGFloat)yValue;- (void)原创 2017-10-15 11:08:35 · 373 阅读 · 0 评论 -
mac系统如何生成SSH key与GitHub通信
一、检查 SSH key 是否存在在终端输入:ls -al ~/.ssh如果没有,终端显示如下:No such file or directory如果已经存在,则会显示 id_rsa 和 id_rsa.pub二、生成新的 SSH key在终端输入:ssh-keygen -t rsa -C "your_email@examp转载 2017-04-13 14:17:42 · 21002 阅读 · 0 评论 -
自定义CALayer动画
当我们需要区实现一个layer的时候,并且需要为其添加一个属性动画的时候,我们需要有这么几步操作:首先,我们需要去继承一个CALayer类,同时实现以下的几个方法:+ (BOOL)needsDisplayForKey:(NSString *)key方法来判断当前属性改变是否需要重新绘制。如果想实现自定义动画就需要重载这个方法,当key等于扩展属性时return yes即可;原创 2017-06-29 21:28:45 · 322 阅读 · 0 评论 -
ios学习网址
一些小的技巧:http://www.cnblogs.com/QianChia/tag/iOS%2010/原创 2017-04-24 13:24:14 · 248 阅读 · 0 评论 -
IOS开发第四天-UI相关组件
UIButton:UIButton只能用类方法来获得对象,而不是利用init来初始化,由于其自身维护。UIButton的创建方式: //获得UIButton对象 UIButton* btn=[UIButton buttonWithType:UIButtonTypeRoundedRect]; //设置button的位置以及大小; btn.frame=CGRectM原创 2017-04-15 11:19:44 · 289 阅读 · 0 评论 -
IOS开发第二天-Object-c反射机制
获取Class在OC中每一个类都有一个对应的Class,Object-C程序中获得Class通常有如下3中方式:使用Class NSClassFromString(NSString* aClassName)函数来获取Class,该函数需要传入字符串参数,该字符串参数的值为某个类的类名。调用某个类的class方法来获得对应的Class。调用某个对象的class方法,由于该方法是NSO原创 2017-04-11 19:24:44 · 803 阅读 · 0 评论 -
IOS开发第三天-内存管理
内存管理对于有效的内存管理,通常认为包括两个方面的内容:内存分配:当程序创建对象时需要为对象分配内存。应该采用合理的设计,劲量减少对象的创建,并减少对创建过程中的内存的开销。内存回收:当程序不需要对象时,系统必须及时回收这些对象所占用的内存,以便程序可以再次使用这些内存。在xcode4.2之前,OC的内存回收必须在程序中通过retain、release、autorelease方原创 2017-04-12 19:18:48 · 332 阅读 · 0 评论 -
IOS开发第二天-协议与委托
非正式协议OC中的协议就类似于Java等语言中的接口。协议的所有性质都可以参照接口的方式去思考,所以有面向接口(协议)编程来达到松耦合的效果。正如Java中的接口,协议的定义也是多个类共同的公共行为规范,这些行为是于外部交流的通道。所以,协议是一组公共的方法,但这些方法并不在协议中实现,方法的实现则交给类去完成,利用类别来实现一个非正式的协议,即是给NSObject设置类别。@inte原创 2017-04-11 16:17:32 · 360 阅读 · 0 评论 -
IOS开发常用技巧以及说明
1、如何在Xcode中为类以及成员函数写文档注释?参考地址:XCODE文档注释的几种写法;其中,当我们在类方法上写好注释后(注意,要写在接口文件中),在*.m文件中,利用option+鼠标左键进行显示描述。原创 2017-04-11 13:39:42 · 354 阅读 · 0 评论 -
IOS开发第二天-类别与扩展
类别介绍:在OC中没有抽象类的语法支持,为了达到这个目的,使用类别来实现。类别(category),oc的动态特征允许使用类别为现有的类添加新方法,并不需要创建子类,不需要访问原有类的源代码。Category定义格式如下:@interface 已有类(类别名),,,方法定义@end类别的实现部分:@implementation 已有类别(类别名)//方法实现@e原创 2017-04-11 11:46:51 · 532 阅读 · 0 评论 -
ios开发第一天-包装类
oc是面向对象的语言,与java类似,由于存在int,double,float等类型,因此,提供了NSValue和NSNumber来封装c语言中的基本类型。注意:NSInteger,NSUInteger,CGFloat这些是利用typedef定义的新类型,其并不是类,仍然是基本类型。NSValue与NSNumber其中,NSValue是NSNumber的父类,两者都是包装类,NSV原创 2017-04-10 20:57:53 · 440 阅读 · 0 评论