- 博客(39)
- 收藏
- 关注
原创 Xcode升级到14.3 archieve打包失败
项目所在路径/Pods/Target Support Files/Pos-xxAPP/Pods-xxAPP-frameworks.sh。由于手机升级到了16.4,不得不升级Xcode,升级到14.3后,才发现在打包时报错了,提示如下。后面查阅才知道,在Xcode 14.3beta版就有这个问题,一直没有修复,具体查看。如果你本地还有14.2的环境,也可以切换成14.2的环境下去打包。修改后,再次archieve就可以成功了,亲测,能解决。
2023-04-03 18:42:46
1524
4
原创 Flutter framework在线上构建时的包大小优化
混合开发线上构建之flutter包大小优化前景打包flutterflutter引擎包的来源缩减fluter framework大小总结前景因为项目要使用jenkins线上构建,所以整个项目的资源都要上传到git或者svn仓库里面,而某些仓库有大小限制,超过一定大小,就会不让上传,同时因为一个flutter的release的framework占据有几百M,你代码上传、拉取都会变得很慢,也影响构建的速度。针对这一现象,就要考虑如何去做进一步优化。打包flutter线上构建使用flutter自带的命令f
2022-03-25 11:13:06
3463
2
原创 iOS 内购服务器验证失败返回21004
21004The shared secret you provided does not match the shared secret on file for your account.p
2021-06-15 18:02:40
1935
原创 iOS 性能优化-启动优化、main函数之前优化-二进制重排
一个app的启动时间,很大程度会影响用户的体验,之前我们已经探究过dyld加载的流程,启动流程分为main函数之前和main函数之后。时间检测我们可以设置环境变量DYLD_PRINT_STATISTICS来检测,这样可以查看main函数前的打印时间。dylib loading time:加载动态库 rebase/binding time: ASLR随机生成一个地址,重新绑定地址/映射 ObjC setup time:OC类的注册 initializer time:load方法的加载
2021-05-24 17:47:34
527
1
原创 YYAnimatedImageView--gif在ios14之后只能播放一次
在iOS14之后,使用imageIo 内的CGImageDestinationAddImage合成的gif在YYAnimatedImageView上只播放了一次就停止了,没有无限循环播放。在网上查了很多,gif的播放次数与内部kCGImagePropertyGIFLoopCount这个参数有关。我自己生成的gif,转成NSData后,去获取loopcount不为0,这里的gifProperty有时候为nil最后也打印为0。-(void)prepareGif:(NSData*)data {
2021-05-21 17:28:47
1618
原创 iOS进阶之底层原理-block本质、block的签名、__block、如何避免循环引用
面试的时候,经常会问到block,学完本篇文章,搞通底层block的实现,那么都不是问题了。block的源码是在libclosure中。我们带着问题来解析源码:blcok的本质是什么 block的方法签名 __block的作用 如何避免循环引用block种类block总共有6种,常用的是3种_NSConcreteStackBlock、_NSConcreteAutoBlock、_NSConcreteGlobalBlock,其他三种是系统调用。void * _NSConcreteS
2021-05-18 16:33:05
387
1
原创 +[NSTimer scheduledTimerWithTimeInterval:repeats:block:]: unrecognized selector sent to xxx
这两天升级了下,然后更改了以前的代码NSTimer,这个方法会造成循环引用。[NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(showUp) userInfo:nil repeats:NO];所以改成了下面代码,但是发现升级后,有用户反馈崩溃了,根据友盟提供的崩溃日志找到了源头,[NSTimer scheduledTimerWithTimeInterval:0.2 repeats:NO b
2021-05-17 10:46:50
526
原创 iOS进阶之底层原理-锁、synchronized
锁主要分为两种,自旋锁和互斥锁。自旋锁线程反复检查锁变量是否可用,处于忙等状态。一旦获取了自旋锁,线程会一直保持该锁,直至释放,会阻塞线程,但是避免了线程上下文的调度开销,适合短时间的场合。互斥锁是⼀种⽤于多线程编程中,防⽌两条线程同时对同⼀公共资源(⽐如全局变量)进⾏读写的机制。该⽬的通过将代码切⽚成⼀个⼀个的临界区⽽达成。递归锁同一个线程可以加锁N次而不会引发死锁 。NSRecursiveLock ;pthread_mutex(recursive)读写锁读写锁实际是⼀种特
2021-05-13 17:39:37
324
原创 iOS进阶之底层原理-线程与进程、gcd
线程与进程线程的定义线程是进程的基本单位,一个进程的所有任务都在线程中执行 进程要想执行任务,必须的有线程,进程至少要有一条线程 程序启动默认会开启一条线程,也就是我们的主线程进程的定义进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用的且受保护的内存中进程与线程的区别地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。 资源拥有:同一进程内的线程共享本进程的资源如内存、I/O、cpu等,但是进程之间的资源是独立的。
2021-05-07 18:08:20
368
原创 iOS进阶之底层原理-weak实现原理
基本上每一个面试都会问weak的实现原理,还有循环引用时候用到weak,今天我们就来研究下weak的实现原理到底是什么。weak入口我们在这里打个断点,然后进入汇编调试。这里就很明显看到了入口,objc_initWeak,接下来就进入objc的源码。官网链接,直接下载最新的。在源码内顺序为objc_initWeak-->storeWeak-->weak_unregister_no_lock。下面为大致流程,内部还有些判断条件省略了。从SideTable散列表中找到弱引用表
2021-05-06 14:23:32
343
原创 iOS进阶之底层原理-应用程序加载(dyld加载流程、类与分类的加载)
iOS应用程序的入口是main函数,那么main函数之前系统做了什么呢?我们定义一个类方法load,打断点,查看栈进程,我们发现dyld做了很多事,接下来就来探究到底dyld做了什么。什么是dylddyld是英文the dynamic link editor的简写,翻译过来就是动态链接器,是苹果操作系统的一个重要的组成部分。在iOS/Mac OSX系统中,仅有很少量的进程只需要内核就能完成加载,基本上所有的进程都是动态链接的,所以Mach-O镜像文件中会有很多对外部的库和符号的引用,但...
2021-04-27 18:04:27
543
原创 iOS进阶之底层原理-消息机制
消息发送的本质是objc_msgSend,至于为啥是这个,可以通过断点调试,这样就直接进入汇编,因为是汇编代码,熟悉常用指令即可,大部分根据注释走下去objc_msgSend源码分析流程这是一段汇编代码,直接搜索objc_msgSend,在arm.s的文件中 Entry_objc_msgSend 消息接收者的判断 GetClassFromIsa_p16 isa指针处理 CacheLookup(查找缓存) CacheLookup2(ca che_t处.
2021-04-26 11:24:39
212
原创 iOS进阶之底层原理-cache_t
接着上一篇的对象结构探索,我们详细介绍cache_t。源码为最新的objc4-818.2。cache_t的底层结构struct cache_t {// 省略一堆私有属性,方法public: // The following four fields are public for objcdt's use only. // objcdt reaches into fields while the process is suspended // hence doesn't c
2021-04-25 17:01:03
151
原创 iOS进阶之底层原理-isa与对象
上一篇文章探究了对象的创建已经底层结构,这篇详细介绍isa、对象以及互相的关系。isa是什么从源码分析,isa是个共用体,封装了类的信息。nonpointer:是否对isa指针开启指针优化,0为纯isa指针,1:不止对象地址,还包含了类信息、对象引用计数等 has_assoc:关联对象标志位 has_cxx_dtor: 是否有c++析构函数xin shiftcls:存储类指针的值 magic:用于调试器判断当前对象是否是真的对象还是没有初始化的空间 weakly_referenced:
2021-04-23 16:18:31
227
原创 iOS 进阶之底层原理一OC对象原理alloc做了什么
人狠话不多,直接上干货。首先,我们来思考,下面这段代码的输出是否相同。答案很明显,p1、p2、p3是指向相同的对象,但是指针地址是不同的。那么问题来了,为啥呢。保留这个疑问,我们来探索alloc和init到底在底层到底做了什么。- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. FFPerson *p1 = [FFPerson a
2021-04-22 16:40:42
146
原创 Xcode11 上传苹果卡在Authenticating with the iTunes store 或者transpoter上传卡在正在验证 APP - 正在通过App Store进行认证
这里直接借鉴网上案例我自己试成功的方法,本文只是加了自己对电脑登录名的获取方法,然后为了让别人可以直接借鉴这种方法而写,大部分流程都是原创大神写的,链接也有Xcode11后,会移除自带的transpoter,我们需要自己下载transpoter来上传ipa包Transporter安装上第一次打开后,会在硬盘目录:/用户/你的电脑登录账号名/资源库/Caches/com.apple.amp....
2021-01-12 15:16:07
1151
2
原创 iOS - Flutter混合开发
第一种 生成framework导入1、创建flutter项目 (不包含完整的ios和安卓),生成的项目中,ios和安卓的项目为隐藏文件在终端输入命令行。在生成的项目中进行flutter开发 flutter create -t module flutter_moudle 2、将flutter项目编译成framework,进入flutter项目中,输入以下代码,生成在flutter项目同一层级 flutter build ios-framework --output=../f..
2020-09-23 16:41:09
594
原创 使用Freestreamer 拖动滑动条音频重新播放或者没有声音seekToPosition无效
当遇到这个问题的时候,自己也是上网查了很多资料,可惜得到的答案并不全,这里根据自己的问题,给出相应的解决方案,希望能帮助大家。刚开始的时候,我的slider只是监听了valuechange方法,直接去调用freestreamer提高的seekTopostion方法,导致音频没有声音,但是回掉的进度是正常的,我们需要更改slider的监听方法,如下代码,这样就能达到预期效果。// touchDown- (IBAction)audioProgresstouchBegain:(id)sender {
2020-09-11 14:37:13
423
原创 ios-性能优化
卡顿原因首先我们得了解屏幕成像原理,这是CPU和GPU起着至关重要的作用CPU(Central Processing Unit,中央处理器) 对象的创建和销毁、对象属性的调整、布局计算、文本的计算和排版、图片的格式转换和解码、图像的绘制(Core Graphics) GPU(Graphics Processing Unit,图形处理器) 纹理的渲染在iOS中是双缓冲机制,有前帧缓存...
2019-11-06 15:44:38
188
原创 内存管理-定时器循环、内存布局、tagged pointer、weak指针、copy、自动释放池
先上代码,我们平时用的定时器,cadisplaylink、nstimer,CADisplayLink、NSTimer会对target产生强引用,如果target又对它们产生强引用,那么就会引发循环引用{ CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(test)];...
2019-11-04 17:24:47
193
原创 多线程及相关面试题与拓展
首先,抛出几个面试题,相信看完介绍就会明白怎么解答了。你理解的多线程? iOS的多线程方案有哪几种?你更倾向于哪一种? GCD 的队列类型 线程安全的处理手段有哪些? OC你了解的锁有哪些?ios中常见的多线程方案我们这里主要讲解GCDGCD中有两个常用的函数,分别为同步和异步// 同步dispatch_sync(dispatch_queue_t queue, d...
2019-10-31 12:24:54
151
原创 RunLoop深度探究以及有关面试题
首先什么是runloop?顾名思义,运行循环,在程序运行中做一些事情。下面就是一个runloop,让程序不会马上退出,保持运行状态int main(int argc, char * argv[]) { NSString * appDelegateClassName; @autoreleasepool { // Setup code that might c...
2019-10-24 16:45:08
206
原创 “xxx”的 iPhone has denied the launch request. Internal launch error: proce
百度是很强大的,刚遇到这个问题,我先百度了下,按照网上信息的看法,我发现并不是这样,但是或许有的用户也可能是因为这个原因,后来,我才发现,同一个bundlid下我之前真机测试的时候有添加过,你只要把之前同一个bundlid的项目删掉就可以了...
2019-10-23 18:29:38
3338
原创 Xcode10 修改代码后,编译没有反应,或者导入头文件没有提示
这两个问题都是一种解决方案,就是打开xcode->file - >workspace settings 然后看图吧如果你编译后还是没有反应,那么你重启一下xcode,再重启一下电脑,就可以了,小编就是重启后才恢复正常。...
2019-10-23 10:20:16
805
原创 isa详解
在arm64架构之前,isa就是一个普通的指针,存储着Class、Meta-Class对象的内存地址从arm64架构开始,对isa进行了优化,变成了一个共用体(union)结构,还使用位域来存储更多的信息nonpointer0,代表普通的指针,存储着Class、Meta-Class对象的内存地址1,代表优化过,使用位域存储更多的信息has_assoc是否有设置过关联对象...
2019-10-14 09:56:30
2223
原创 RSA初探
上世纪70年代产生的一种加密算法。其加密方式比较特殊,需要两个密钥:公开密钥简称公钥(publickey)和私有密钥简称私钥(privatekey)。公钥加密,私钥解密;私钥加密,公钥解密。这个加密算法就是伟大的RSA。欧拉函数定义:任意给定正整数n,请问在小于等于n的正整数之中,有多少个与n构成互质关系?计算这个值的方式叫做欧拉函数,使用:Φ(n)表示。如果两个正整数,除了1以外,没...
2019-10-11 22:31:47
164
原创 面试题-Block
block的原理是怎样的?本质是什么?封装了函数调用以及调用环境的OC对象__block的作用是什么?有什么使用注意点?__block可以用于解决block内部无法修改auto变量值的问题 __block不能修饰全局变量、静态变量(static) 编译器会将__block变量包装成一个对象 使用注意点:在MRC情况下,当__block变量被copy到堆上时,不会对其产生强引用b...
2019-10-10 22:20:48
306
原创 面试题-Category(分类)
1、Category的实现原理Category编译之后的底层结构是struct category_t,里面存储着分类的对象方法、类方法、属性、协议信息 在程序运行的时候,runtime会将Category的数据,合并到类信息中(类对象、元类对象中)2、Category和Class Extension的区别是什么?Class Extension在编译的时候,它的数据就已经包含在类信息中...
2019-10-08 15:14:58
278
原创 iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?)
先给答案,我们再探具体:利用RuntimeAPI动态生成一个子类,并且让instance对象的isa指向这个全新的子类 当修改instance对象的属性时,会调用Foundation的_NSSetXXXValueAndNotify函数 willChangeValueForKey: 父类原来的setter didChangeValueForKey: 内部会触发监听器(Ober...
2019-09-26 10:17:44
417
原创 对象的指针指向哪里,oc的类信息存放在哪里
对象指针指向instance对象的isa指向class对象 class对象的isa指向meta-class对象 meta-class对象的isa指向基类的meta-class对象但是isa指针的地址值并不是指向的对象的地址值,需要转换一下,&ISA_MASK,这是objc4源码里面找出来的oc的类存放在对象方法、属性、成员变量、协议信息,存放在class对象中 类方...
2019-09-25 13:51:25
1349
原创 一个NSObject对象占多少内存?
以下都是在64bit环境下操作:我们平时编写的Objective-C代码,底层实现其实都是C\C++代码在这里我们将main.m 使用clang转成c++文件,也就是在终端输入xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main.cpp这样,在文件夹里就会生成main.cpp文件。然后我们查看nso...
2019-09-19 18:37:13
194
原创 iOS无法导入头文件
file --> workspace settings -- 将build system -- legacy build system
2018-01-19 13:50:07
354
转载 ios面试数据结构与算法
1、不用中间变量,变换A和B的值// 1.中间变量void swap(int a, int b) { int temp = a; a = b; b = temp;}// 2.加法void swap(int a, int b) { a = a + b; b = a - b; a = a - b;}// 3.异或(相同为0,不同为1. 可以理解为
2018-01-14 11:50:15
4213
原创 初学快速排序
什么都不说,直接举例比上代码容易理解,有一组数:6,1,2,7,9,3,4,5,10,8以6为基数,左边角标为i,右边为j,从右边开始往左走,遇到比6小的停下,角标变为j,这里开始就是5,然后i再向右走,遇到比6大的停下,这里就是7,角标变为i,交换角标i和j对应的值,变成:6,1,2,5,9,3,4,7,10,8;这时候再继续j先向左走,遇到了4停下,角标变为j,i也同样,这时候再交换角标i
2018-01-06 10:16:16
152
原创 初学选择排序
直接举例吧,更加容易看懂:有10个数:1,4,5,7,10,2,8,9,3,6第一趟:1,4,5,7,10,2,8,9,3,6第二趟:1,2,5,7,10,4,8,9,3,6第三趟:1,2,3,7,10,4,8,9,5,6第四趟:1,2,3,4,10,7,8,9,5,6...最后变成:1,2,3,4,5,6,7,8,9,10arr = [1,4,5,7,10,2
2018-01-05 16:58:39
134
原创 初学者的冒泡排序
冒泡排序,就是一次将一堆无序的数组通过编程变成有序的数组,比如存在10个不同大小的气泡,由底至上地把较少的气泡逐步地向上升,这样经过遍历一次后,最小的气泡就会被上升到顶(下标为0),然后再从底至上地这样升,循环直至十个气泡大小有序。int main(){ int array[10] = {10,20,15,3,225,80,50,70,324,234}; int i,j; for(i =
2018-01-05 16:42:56
210
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人