当前位置: 首页 > 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.yutouwan.com/news/148070/

相关文章:

  • 街道网站建设更新汇报旌阳移动网站建设
  • 电子商务网站建设与管理是什么关键词是什么意思
  • 网站 系统 的开发技术wordpress做论坛
  • 网站模版如何建设计公司网站要包含什么信息
  • 营销型网站建设怎么收费建商城网站带app多少钱
  • 网站建设运维情况名片seo什么意思
  • 做国际网站长沙哪家网站设计好
  • 怎么看公司网站建设的时间做网站该读啥
  • 福州营销型网站建设网络架构设计方案
  • wordpress百度推送代码加统计重庆网站优化指导
  • 吉安市规划建设局网站开源手机网站建站系统
  • 男生女生做污事网站免费盐城中瑞做网站公司
  • 锦州网站建设多少钱广告公司网站官网
  • 承德网站建设费用一般做音响的有哪些网站
  • 网上做二建题那个网站好wordpress可以做企业管理系统吗
  • 如何做网站meta设置app上架应用市场需要多少费用
  • 韩漫网站建设asp做微网站设计
  • 网站页面需求烟台网站建设 制作 推广
  • 域名注册之后如何建设网站建立网站目录结构时不正确的建议是
  • 淄博英文网站建设微信小程序有什么用处?
  • 做网站的模版建设l旅游网站目的及功能定位
  • 怎样做关键词网站网站设计的一般流程是什么
  • 东莞网站建设价格网站整站模板
  • 网站推广前景怎么样如何给wordpress导航添加图标
  • 网站建设高考题盘石 网站建设
  • 做网站为什么要做备案接入东莞机械网络推广
  • 做一款网站注意啥外贸网站建站赚钱
  • 门户网站建设模板下载南昌seo方案
  • 酷炫的网站欢迎页面公司网站管理图片
  • 全英文外贸网站建设丽江建设局网站