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

试了下xcode的arc

为什么80%的码农都做不了架构师?>>>   hot3.png

由strong和weak牵引而出,是相当新的东西,这是一种在编译时为程序添加retain等操作代码的方法,从而使得开发者不用关注内存的释放问题,让开发者有种像JAVA开发者的快乐感。

比如你在一个方法里面有这样的代码(没有arc):

Person *person = [[Person alloc] init:@"kut"];
[person show];
[person release];

而在使用arc时,你也就不需要向person发送release消息了。如下

Person *person = [[Person alloc] init:@"kut"];
[person show];

xcode为自动为你添加release代码,当然,这是在编译时做的事情。

而定义属性时,会用到两个关键字:strong, weak,强引用和弱引用。其实就是拥有者和引用者的区别,比如说,你拥有一个对象,那么你就负责该对象的释放,你就是拥有者。而你只是引用一个对象,对象的清理和你没有关系,那么你就是引用者。按照这样的逻辑,当拥有者释放一个对象时,其它引用者原引用这个对象的实例变量就会变成nil。

比如:在Person类中有一个属性name,Person拥有这个name:

@property (strong) NSString *name;

而在Team类中,他只是引用这个Person的name:

@property (weak) NSString *managerName;

那么当person.name = nil;时,而team.name也会自动变为nil。

 

当我写到这儿的时候,我发现了一个问题,其实真实并不是这样运作的,-_-,让我再实验一下先。

@interface Person : NSObject
    @property (strong) NSString *name;
@end

@interface Team : NSObject
    @property (strong) Person *manager;
    
    - (id)init;
@end

@implementation Team

@synthesize manager;

- (id)init
{
    if (self = [super init]) {
        Person *person = [[Person alloc] init];
        person.name = @"kut";
        self.manager = person;
    }
    
    return self;
}

@end

@interface Group : NSObject
    @property (weak) Person *leader;
@end

int main(int argc, char *argv[])
{
    @autoreleasepool {
        Team *team = [[Team alloc] init];
        // code 1
        NSLog(@"team manager: %@", team.manager.name);
        
        Group *group = [[Group alloc] init];
        group.leader = team.manager;
        // code 2
        NSLog(@"group leader: %@", group.leader.name);
        
        team.manager = nil;
        NSLog(@"team manager: %@", team.manager.name);
        NSLog(@"group leader: %@", group.leader.name);
    }
}

像上面的代码,运行结果会大出你意料,最后一条NSLog输出group leader: kut,而不是group leader: (null)。

但是如果把//code 2下的NSLog语句去掉,则最后一条NSLog输出则按上面的诠述一样运行,输出的是group leader: (null)。

这里增加了arc的不确定性,如果weak引用的对象在此次使用之前被使用过一次,那么它一直存在,直到autoreleasepool释放它,否则就是nil,这样就麻烦了,如果代码层次很多,那么就不能保证能确定之前如果被使用过,这样代码运行的结果的不确定性就让人很头疼了。

建议不要用arc,就上面这一点就足以让我放弃使用它了。

转载于:https://my.oschina.net/kut/blog/39968

相关文章:

  • SCUT - 216 - 宝华科技树
  • oracle
  • 2019牛客暑期多校训练营(第八场) - B - Beauty Values - 水题
  • 免费ARP的作用
  • SCUT - 161 - 灯游 - 数学
  • service命令
  • JavaScript + ASP.NET
  • 用主机头名法实现一个IP建多个Web站点
  • SCUT - 484 - 平面上的点 - 数据结构
  • 财务软件的设计
  • SCUT - 483 - 数轴上的点
  • ruby on rails开发B/S的相关经验
  • Codeforces - 1202D - Print a 1337-string... - 构造
  • 通用权限管理系统组件 (GPM - General Permissions Manager) 中实现大数据的高效分页显示...
  • 《学习之道》第十六章左脑的作用
  • bootstrap创建登录注册页面
  • css属性的继承、初识值、计算值、当前值、应用值
  • ECMAScript入门(七)--Module语法
  • java概述
  • Java知识点总结(JavaIO-打印流)
  • magento 货币换算
  • MYSQL 的 IF 函数
  • Netty源码解析1-Buffer
  • node学习系列之简单文件上传
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • vue-router 实现分析
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 爱情 北京女病人
  • 成为一名优秀的Developer的书单
  • 免费小说阅读小程序
  • 前言-如何学习区块链
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 由插件封装引出的一丢丢思考
  • Android开发者必备:推荐一款助力开发的开源APP
  • RDS-Mysql 物理备份恢复到本地数据库上
  • Spring Batch JSON 支持
  • 交换综合实验一
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • # Apache SeaTunnel 究竟是什么?
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • $L^p$ 调和函数恒为零
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转载)Linux 多线程条件变量同步
  • .Net 路由处理厉害了
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .net经典笔试题
  • .so文件(linux系统)