![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
iOS高级
文章平均质量分 58
chokshen
技术改变人生!
展开
-
iOS中如何hook代理方法
在iOS中要hook某个类的实例方法是比较简单的,直接交换它的IMP指针即可达到目的,例如:+ (void)load { static dispatch_once_t oncetoken; dispatch_once(&oncetoken, ^{ SEL originalSelector = @selector(viewWillAppear:); SEL swizzledSelector = @selector(hook_viewWillAppe原创 2021-04-20 15:45:13 · 1926 阅读 · 0 评论 -
Block捕获变量的典型案例
static NSInteger num3 = 300;NSInteger num4 = 3000;- (void)blockTest{ NSInteger num = 3; static NSInteger num2 = 30; __block NSInteger num5 = 30000; NSMutableArray * arr = [NSMutableArray arrayWithObjects:@"1",@"2", nil]; void(^block.原创 2021-04-10 22:21:16 · 194 阅读 · 0 评论 -
对于GCD中队列与线程的理解
队列(Dispatch Queue):指执行任务的等待队列,即用来存放任务的队列。队列是一种特殊的线性表,采用 FIFO(先进先出)的原则,即新任务总是被插入到队列的末尾,而读取任务的时候总是从队列的头部开始读取。每读取一个任务,则从队列中释放一个任务。队列的结构可参考下图任务:一段代码,本质上就是一系列指令在 GCD 中有两种队列:『串行队列』和『并发队列』。两者都符合 FIFO(先进先出)的原则。两者的主要区别是:执行顺序不同,以及开启线程数不同。串行队列(Serial Dispa...原创 2021-02-07 10:54:32 · 491 阅读 · 0 评论 -
Xcode 12 : error: ‘xxx/xxx.h‘ file not found or No such module ‘xxx‘
最近几天为了适配iOS14,将Xcode11升级到了Xcode12,一编译果然还是熟悉的味道。原创 2020-09-29 10:21:42 · 2045 阅读 · 0 评论 -
iOS界面刷新机制
当在操作 UI 时,比如改变了 Frame、更新了 UIView/CALayer 的层次时,或者手动调用了 UIView/CALayer 的 setNeedsLayout/setNeedsDisplay方法后,这个 UIView/CALayer 就被标记为待处理,并被提交到一个全局的容器去。苹果注册了一个 Observer 监听 BeforeWaiting(即将进入休眠) 和 Exit (即将退出Loop) 事件,回调去执行一个很长的函数:_ZN2CA11Transaction17observer_c原创 2020-09-21 17:48:27 · 2606 阅读 · 0 评论 -
使用UIPanGestureRecognizer手势时的注意事项
在iOS中,通常会使用pan手势来做控件拖拽的功能,但是在使用pan手势的时候,应当使用frame来进行布局而不是AutoLayout。特别是在拖拽的过程中,如果同时刷新拖拽视图内部的子控件,会导致拖拽出现问题,例如拖拽完回后自动回到初始位置。...原创 2019-12-06 11:15:18 · 577 阅读 · 0 评论 -
addChildViewController的正确姿势
项目中经常出现一个控制器添加多个子控制器的情况,例如今日头条的标签切换视图,使用addChildViewController的正确姿势如下: 先添加第一个控制器,其余控制器暂时不用添加: //A控制器 let vcA = ViewControllerA() self.addChildViewController(...原创 2018-09-02 13:52:40 · 7788 阅读 · 0 评论 -
安卓和iOS音频互通方案总结
项目中独立开发语音聊天功能,涉及到了语音录制和语音播放这两大块技术,由于后台更换平台的缘故导致这一功能前前后后调整了几次方案,特此记录总结:1.AMR格式一开始和安卓端约定的音频格式是amr,因为amr格式的音频文件比较小,而且音质也还不错,微信语音聊天也是采用的这种格式。安卓端那边直接是可以直接录制amr格式的音频,代码如下:mRecorder = new MediaRecorde...原创 2018-12-03 16:15:57 · 3829 阅读 · 0 评论 -
KVO remove observer引发的crash
crash日志:*** Terminating app due to uncaught exception 'NSRangeException', reason: 'Cannot remove an observer <XXXViewController 0x7ff158707f80> for the key path "xxx" from <XXXViewControll...原创 2019-01-11 16:22:38 · 7351 阅读 · 0 评论 -
关于iOS安装包的瘦身
一、IPA包分析1、生产ipa包的流程:1)Product->Archive2)Distribute App3)Development4)一直点next就可以生成ipa包2、打开ipa包1)用系统自带的归档工具打开,打开后显示Payload文件夹2)进入Payload文件夹,可以看见相应的应用,右键显示包内容,就可以看见安装包的各部分组成...原创 2019-03-13 10:57:38 · 207 阅读 · 0 评论 -
UserDefaults引发的应用卡死,甚至手机卡死
项目里面有个哥们使用UserDefaults来保存草稿信息,保存的实例对象包含了大量的图片base64字符串(简直无语。。。),直接导致应用卡死,甚至手机卡死。但是,当保存的图片数量很少的时候又不会卡死,所以我猜测是保存的图片数量太多导致需要保存到UserDefaults所需要的空间太大,所以导致应用卡死。官方推荐也是UserDefaults来用于保存小型数据量的,比如说用户信息,保存大型数据还是...原创 2019-04-03 11:12:38 · 490 阅读 · 0 评论 -
iOS中UITableView的cellForRowAt以及UICollectionView的cellForItemAt方法不走的原因
在项目中偶尔会遇到UITableView和UICollectionView的DataSource方法不走的情况,一般原因有几个:1、没有设置DataSource的代理对象2、UITableView和UICollectionView的frame存在问题,比如说它们的宽或高为0的情况,这时候UITableView的cellForRowAt或者UICollectionView的cellForIt...原创 2019-07-11 20:46:52 · 2836 阅读 · 0 评论 -
pod 'filename used twice' build error
项目里一直存在一个很奇怪的问题,每次用pod导入一个新的第三方库,已经存在的第三方库就会报编译错误:'filename used twice' 以前以为是第三方库有问题,所以重新导入,问题得到了暂时的解决。但是指标不治本,每次pod新的第三方库,又会报这个错误。项目闲下来后仔细研究了下这个问题,发现是pod的project.pbxproj文件存在问题,重复引用第三方库的某些文件,所以导致...原创 2019-08-15 15:45:17 · 372 阅读 · 0 评论 -
Notification多次调用而引发的内存泄漏问题
最近项目中出现了一个奇怪bug,后台反映我在1s内同时发起了100多次请求,直接把后台整奔溃了。经过代码核查发现,我是在发送一个通知后,引发的多次后台请求。但是,经过测试我只post一次通知,所以感觉很奇怪,于是乎在addObserver的地方断点,奇怪的现象出现了,明明只post一次通知,但是却接受到了多次通知,所以只能一种可能:注册通知的时候存在多次重复注册通知。为什么会出现这...原创 2018-08-14 22:06:31 · 1792 阅读 · 0 评论 -
切换UIWindow的rootViewController时导致的内存泄漏
一、切换rootViewController之前,present某一控制器 self.window = UIWindow.init(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)) self.window?.root...原创 2018-07-25 21:50:20 · 3851 阅读 · 0 评论 -
CALayer的注意事项
1.一个父Layer添加一个子Layer时,如果设置了父Layer的边框属性,那么子Layer只能覆盖父Layer边框内部的部分,边框本身不会被覆盖- (void)viewDidLoad { self.view.backgroundColor=[UIColor lightGrayColor]; [super viewDidLoad]; //创建子layer CA原创 2017-02-18 23:14:44 · 300 阅读 · 0 评论 -
关于block循环引用的问题
1.首先来看典型的block循环引用#import "ViewController.h"@interface ViewController ()@property (copy,nonatomic) void (^printBlock)();@property (copy,nonatomic) NSString *name;@end@implementation ViewContr原创 2017-05-24 19:29:44 · 449 阅读 · 0 评论 -
浅谈iOS设计模式
1.MVC(官方)(1)MVC是现在iOS的主流设计模式,也是苹果官方主推的设计模式。MVC由三部分组成,M-模型,负责提供数据,将字典转模型,逻辑会更加清楚;V-视图,将数据渲染在视图上,即业务展示;C-控制器,核心部分,用于协调M-V之间的关系,由于M提供数据以及V将数据渲染在视图上都是被动的,它们都是受C控制的,通俗的说法就是将M提供的数据渲染在V上。(2)优化的MVC,通常在MVC...原创 2017-05-24 15:02:32 · 676 阅读 · 0 评论 -
关于属性传值为空的问题
先来看下面这段代码: _collectionView.didClickCellAtItemIndexPathBlock=^(Video *video) { DetailViewController *detailVC=[[DetailViewController alloc]init]; //一定要记得设置控制器的背景颜色,否则会造成push卡顿的假象原创 2017-06-04 20:23:17 · 2310 阅读 · 0 评论 -
实现UILabel自适应高度的两种方式
1.sizeThatFits或者sizeToFit UILabel *label=[[UILabel alloc]init];labell.font=[UIFont systemFontOfSize:11.0];label.text = @"今天天气不错呢,准备到中国参加耐克的活动,中国的球迷准备好了吗?明天早上八点五棵松体育馆见,我爱你们!";label.numberOfLine...原创 2016-12-19 14:26:36 · 6578 阅读 · 0 评论 -
iOS导航栏遮挡问题的总结
一.背景:在做开发的时候经常不经意就出现导航栏遮挡主视图的情况,之前出现这种情况我会先看看View UI Hierarchy,然后把视图的坐标手动调整,例如把视图的y坐标写成64(建议封装成宏,因为有刘海的手机状态栏和导航栏的高度之和不是64),即减去状态栏和导航栏的高度之和,这个方法是可行的,但是不适用所有的场景。不同的场景应该采用不同的解决方案,要想找到最合适的解决方案,就必须去研究其中的原理...原创 2017-08-27 16:21:34 · 9615 阅读 · 0 评论 -
微信朋友圈输入框与键盘完美衔接的方法
其中H2=输入框的frame.origin.y-self.tableView.contentOffset.y原创 2017-02-15 21:42:57 · 1960 阅读 · 1 评论 -
UITableView的indexPathForRowAtPoint属性
一、做项目时用到自定义单元格,且单元格中有按钮,项目功能扩展需要点击按钮在每一个单元格的后面增加一个视图,因此需要确定单元格的indexPath属性,然后根据每一个单元格的高度就可以确定每一个单元格的位置,因此就可以增加新的视图,该问题的关键是点击按钮后确定所在单元格的索引,这个时候就要用到一个非常重要的属性indexPathForRowAtPoint。- (void)btnClicked原创 2017-02-04 20:26:48 · 3355 阅读 · 0 评论 -
iOS视图加阴影应该注意的几个问题
1.加阴影导致卡顿 let footView = UIView() footView.layer.shadowRadius = 1 footView.layer.shadowOffset = CGSize(width: 1, height: 1) footView.layer.shadowOpacity = 0.8 fo...原创 2018-03-15 17:35:24 · 1917 阅读 · 0 评论 -
iOS多级菜单、三级城市/地区选择器
Test原创 2018-05-25 23:02:49 · 3627 阅读 · 2 评论