当前位置: 首页 > news >正文

备案的时候需要网站吗晚上必看的正能量网站

备案的时候需要网站吗,晚上必看的正能量网站,德宏芒市建设局网站,福建建设工程设计备案网站如果对象A持有对象B#xff0c;B作为A的associated object#xff0c;并且表面上B没有其他被强引用的地方#xff0c;那么对象A被释放时#xff0c;对象B一定会同时释放吗#xff1f;大部分情况下是#xff0c;但真有不是的时候。最近实现代码的时候不小心就碰到了这样的…如果对象A持有对象BB作为A的associated object并且表面上B没有其他被强引用的地方那么对象A被释放时对象B一定会同时释放吗大部分情况下是但真有不是的时候。最近实现代码的时候不小心就碰到了这样的特殊情况。 需求 需要监听对象A释放dealloc并执行对象A的a方法。此时引入对象B并作为对象A的associated object。A释放时触发B释放在B的dealloc方法中执行A的a方法。对象B需要一个指向对象A的属性并声明为unsafe_unretained或assign因为weak指针此时已经失效了。 示例代码 interface MyObject1 : NSObject endimplementation MyObject1 - (void)foo {NSLog(success); } endinterface MyObject2 : NSObject property (nonatomic, unsafe_unretained) MyObject1 *obj1; endimplementation MyObject2 - (void)dealloc {[self.obj1 foo]; }(instancetype)create {return [[self class] new]; } endimplementation ViewController(void)load {[self fun1]; }(void)fun1 {MyObject1 *mo1 [MyObject1 new];synchronized (self) {MyObject2 *mo2 [MyObject2 create];mo2.obj1 mo1;objc_setAssociatedObject(mo1, selector(viewDidLoad), mo2, OBJC_ASSOCIATION_RETAIN_NONATOMIC);} } end 问题 运行时出现崩溃unsafe_unretained指针已经野了和预期的不一样。堆栈是这样的 观察崩溃的堆栈发现mo2对象是被自动释放池释放了。因为mo1对象是在函数退出时就立即释放这样导致mo1比mo2先被销毁mo2访问了无效指针导致了崩溃。 这个问题和synchronized有关系但目前我还不知道它和arc之间有什么联系。下面给出另一个case修改一行代码就不会崩溃了 (void)fun2 {MyObject1 *mo1 [MyObject1 new];MyObject2 *mo2 [MyObject2 create];synchronized (self) {mo2.obj1 mo1;objc_setAssociatedObject(mo1, selector(viewDidLoad), mo2, OBJC_ASSOCIATION_RETAIN_NONATOMIC);} } 实际上只是把mo2的声明移动到了synchronized外面堆栈变成了这样 这时mo2的释放发生在调用方法的结束时。 分析 使用Hooper查看汇编代码观察fun1和fun2的不同。节选出关键部分 核心在于fun1中创建mo2后调用了retainfun2中调用的则是objc_retainAutoreleasedReturnValue。 我们再来看看create方法 关键的一行在最后调用了objc_autoreleaseReturnValue。 关于objc_retainAutoreleasedReturnValue和objc_autoreleaseReturnValue请移步 https://www.jianshu.com/p/2f05060fa377 。大意是这两个方法成对出现时可以优化掉[[obj autorelease] retain]这种骚操作。 结论 在fun1中由于没有objc_retainAutoreleasedReturnValue取而代之的是retain导致对象被放入自动释放池。对于synchronized为什么会造成不同我还没有那么深入。 因为全局自动释放池会延迟对象的释放如果代码非常依赖对象的释放时机则会比较危险。我认为这样做是最保险的创建一个局部自动释放池保证局部变量在函数结束时立即释放 (void)fun3 {MyObject1 *mo1 [MyObject1 new];autoreleasepool {synchronized (self) {MyObject2 *mo2 [MyObject2 create];mo2.obj1 mo1;objc_setAssociatedObject(mo1, selector(viewDidLoad), mo2, OBJC_ASSOCIATION_RETAIN_NONATOMIC);}} } 原文链接 本文为云栖社区原创内容未经允许不得转载。
http://www.sadfv.cn/news/148070/

相关文章:

  • 电子商务门户网站的研究与实现淄博做网络推广的公司
  • 做网站责任dw网页制做教程
  • 网站开发 在线报名凡科送审平台
  • 淘宝客自建网站网站建设免费学习
  • 长沙网站制作哪家强天津seo优化排名
  • 科技公司网站欣赏公司图标设计大全免费 logo
  • 个人做网站赚钱网站设计制作ihanshi
  • 卡尺 东莞网站建设网页界面设计用什么软件
  • 清远市住房和城乡建设局门户网站wordpress模版mx
  • 教育局门户网站建设目的wordpress 圆角主题
  • 电子商务网站建设与管理设计报告wordpress 免备案cdn
  • 国外网站空间需要备案吗网站优化建设广州
  • 建筑公司网站源码下载初学者求教怎样做网站
  • 网站顶部展出的大幅广告新乡网站建设加盟电话
  • 中国林业网站群建设工程wordpress加百度商桥变慢
  • 网站建设中行为的名词解释保定模板建站软件
  • 手机网站怎样做传世网站建设
  • 网站被抄袭公众号怎么制作投票活动
  • 如何建设运输网站建设网银怎么提高转账限额
  • 淘客优惠券推广网站怎么做centos7装wordpress
  • 深圳市鸿运通网站建设赣州
  • 为什么实验楼网站上做实验这么卡dw软件个人简历网站怎么做
  • 徐州网站建设外包自定义wordpress的字体大小
  • 受欢迎的网站开发网站怎么做七牛云加速
  • kesion系统做网站教程建设银行网站首页打
  • 长沙网站开软件ui设计软件
  • 贵州中航建设集团网站电子商务网站开发模块流程图
  • 高校网站建设管理制度大型网站开发公司
  • 有哪些做应援的网站找做网站技术人员
  • 网站建设程序代码2017年到2018年建设的网站