• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ios > arc和非arc下的retaincount问题

arc和非arc下的retaincount问题

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-05

佚名通过本文主要向大家介绍了retaincount,小米电视 arc 问题,非常规入侵的问题儿童,非公党建存在的问题,非公企业党建存在问题等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: arc和非arc下的retaincount问题
描述:

下面的代码在
非arc下:obC = 1  ob1C = 2
在arc下:obC = 1  ob1C = 1
为什么在arc下  ob1C是1,我觉得应该也是2啊,不是调用了setter吗?setter不是先release旧值,在retain新值的吗?
(_ob和ob1都是用strong声明的)
    _ob = [[NSObject alloc] init];
    self.ob1 = [[NSObject alloc] init];
    
    NSInteger obC = CFGetRetainCount((__bridge CFTypeRef)_ob);
    NSInteger ob1C = CFGetRetainCount((__bridge CFTypeRef)_ob1);


解决方案1:

其实是因为你用 ARC 的话,编译器在 self.ob1 = [[NSObject alloc] init]; 之后就对 obj1 做了一次 release 了
代码如下:


#import <Foundation/Foundation.h>
@interface C : NSObject
@property (nonatomic, strong) NSObject *obj;
@property (nonatomic, strong) NSObject *obj1;
@end
@implementation C
- (instancetype)init {
self = [super init];
_obj = [[NSObject alloc] init];
self.obj1 = [[NSObject alloc] init];
NSInteger obC = CFGetRetainCount((__bridge CFTypeRef)_obj);
NSInteger ob1C = CFGetRetainCount((__bridge CFTypeRef)_obj1);
NSLog(@"%d, %d", obC, ob1C);
return self;
}
@end
int main(int argc, char *argv[]) {
@autoreleasepool {
C *c = [[C alloc] init];
}
}

我们来看类 C 的 init 方法的汇编代码
ARC 编译后得到的汇编代码(这里借助了下 Hopper 生成的伪码,帮助我们看懂汇编代码)

void * -[C init](void * self, void * _cmd) {
    rax = var_20;
    rax = [[rax super] init];
    var_8 = rax;
    objc_storeStrong(0x0, rax);
    rax = [NSObject alloc];
    rax = [rax init];
    rcx = var_8->_obj;
    var_8->_obj = rax;
    [rcx release];
    rax = [NSObject alloc];
    rax = [rax init];
    var_40 = rax;
    [var_8 setObj1:rax];
    [var_40 release];
    NSLog(@"%d, %d", CFGetRetainCount(var_8->_obj), CFGetRetainCount(var_8->_obj1));
    var_48 = [var_8 retain];
    objc_storeStrong(var_8, 0x0);
    rax = var_48;
    return rax;
}

可以看到 set 完成后,都调用了一次 release,所以后面输出的结果是1,1
相对的非 ARC 的汇编代码如下:

void * -[C init](void * self, void * _cmd) {
    rax = var_20;
    var_8 = [[rax super] init];
    var_8->_obj = [[NSObject alloc] init];
    rax = [NSObject alloc];
    rax = [rax init];
    [var_8 setObj1:rax];
    NSLog(@"%d, %d", CFGetRetainCount(var_8->_obj), CFGetRetainCount(var_8->_obj1));
    rax = var_8;
    return rax;
}

可以看到对象在创建后丢给了 set 方法,Retain Count +1,但是在之后并没有调用 release 方法,所以这里输出的结果就是1,2了


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • arc和非arc下的retaincount问题
  • mrc一个关于MRC环境下retainCount的问题

相关文章

  • 2017-06-05 ios现在主流的开发语言是什么啊
  • 2017-06-05 iOS单聊页面
  • 2017-06-05 为什么NSMutableArray继承于NSArray
  • 2017-06-05 搞iOS开发很久了,却一直没有看到github等开源网站有牛逼的iOS架构,求各位大大分享下~~
  • 2017-06-05 中国古代供传递官传递文书的地方叫关于iOS事件传递
  • 2017-06-05 UIAlertController的Action事件反应有点慢?
  • 2017-06-05 如何实现中国梦reactnative如何实现定时提醒
  • 2017-06-05 iOS怎么删除项目中的多余分支
  • 2017-06-05 iOS基础控件关于iOS设置代理问题
  • 2017-06-05 ScrollView掛载,为什么会很久才会显示画面

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 为什么forin不能在按钮触发函数里?
    • 呢图网图库图片设计ios图库选取图片用七牛上传
    • IOS开发如何实现参数化构建编译?
    • 如何获取UILabel中某一个子字符串的坐标
    • ios10為什麼有些文字會跑不出?但其他正常?
    • 双视影院播放器下载ijkplayer的播放本地视频的方法是啥?
    • 苹果IOSqq浏览器调用ajax设置失败导致数据不一致
    • ios自动化测试UITests有什么延迟等待的方法?
    • swift中问号和叹号的作用
    • swiftxcode8下reactiveCocoa转换出错!

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有