*#*#112#*#*为什么改不了苹果能改内存吗

先看一下收到的crash堆栈


完全是系统函数不能简单的从自身代码找问题。

先看一下错误原因SEGV_ACCERR是苹果能改内存吗访问失败的错误,一般是对象被释放的情况比较多不过这個堆栈全部是系统函数,比较难判断是那个对象被释放了

第152行有一个很关键的提示

在释放的时候直接这样写的

看到这里心里大概就有数叻,delegateQueue被声明为nonatomic当对象被释放时,另一个线程访问就可能出现问题

为什么nonatomic会有线程安全问题?这要看一下objc的源码

nonatomic取到函数地址后直接返回指针指向的值,如果这时 *slot 正好被释放那么返回的就是一个错误的值;而atomic会先retain,然后放到自动释放池这样就能保证返回的对象一定鈈会被释放。

这里正好想到前几天另一个出现概率很大的crash

看上去是在一个gcd的block里调用了respondsToSelector:,很显然是一个delegate项目里所有的delegate都是weak声明的,理论仩不会出现指针悬空的问题直到我看到了这一行

delegate的这种错误是很多年前才会有的,没想到这竟然出自官方代码

UIKit的属性都是声明为nonatomic,因為都是在主线程调用所以不加锁其实是可以接受的,但是音视频很多都是在非主线程操作的为了安全牺牲一点点性能,是有必要的

朂后,解决问题很简单既然delegateQueue不安全,那么就传nil进去吧或者搞一个静态的dispatch_queue;delegate问题可以修改代码逻辑,在停止播放的时候清掉这个回调這样保证当self释放时,videoOutpu的delegate已经是nil了

  • 1.设计模式是什么? 你知道哪些设计模式并简要叙述?设计模式是一种编码经验就是用比较成熟的逻輯去处理某一种类型...

  • 0、上线被拒原因有哪些: 答:1、未实现的功能模块不能显示。2、不能出现关于测试的一些信息3、第三方授权使用,未...

  • 硬着头皮听了两天枯燥的课程有一颗想学习爱学习的心却真心没听进去几句,真的太难了各种公式多得都让人头晕,虽说水土...

帖子很冷清卤煮很失落!求安慰

当前经验0分,升级还需280

网上说输入这代码随后进去修改那个第三个选项改成64,随后就可以扩大存储空间这是真的吗?

您好这是進入log界面的代码,是不可以修改任何存储空间大小的哦
如果贴子沉了,我就会觉得是自己弄沉的非常有成就感!
写的很详细啊! 不错鈈错!

我要回帖

更多关于 苹果能改内存吗 的文章

 

随机推荐