捋捋ARC

iOS小技能:-fobjc-arc和 -fno-objc-arc 的使用(在非ARC工程中集成ARC代码、在ARC工程中集成非ARC的第三方代码) 在非ARC工程中集成ARC代码: 使用-fobjc-arc来标记那些通过ARC编译的第三方源代码。 在ARC工程中集成非ARC的第三方代码,编译库里面的文件需要使用-fno-objc-arc 。常见错误: --Cast of an indirect pointer to an Objective-C pointer to ‘CFTypeRef ’ (aka ‘const void *‘ 阅读详情

定义:wiki

捋一捋ARC,或者说看看iOS的内存管理机制

引用计数:

引用计数是来用帮助oc进行内存回收的机制,如上图表示的代码类似于

NSObject *p1 = [NSObject new];
NSObject *p2 = p1;
NSObject *p3 = p1
指针指向了同一块内存区域,即对象存放的区域,用引用计数来描述的话,此刻对象的引用计数为3。

在引用计数为0时该内存区域将被回收用于存储其他。

MRC(manual reference counting)/MRR(manual retain-release):手动引用计数管理

既然是手动,说明引用计数不会像上面的代码一样NSObject *p2 = p1就让obj的引用计数加一。需要手动调用方法retain来增加引用计数

即 NSObject *p2 = [p1 retain];

相应的也不会在p2 = nil时减少引用计数,而需要调用release方法

即 [p2 release];

其他:

 autorelease:调用后,对象会在当前的autoreleasepool结束时将引用计数减1

对象delloc:在dealloc下需要将不再被使用的指针调用release。


那么在ARC的时代下这些方法是怎么做到对开发者不可见的呢

ARC下系统会在编译时期自动加入对应的retain、release

可以考虑以下场景:

1.无返回值的方法:

ARC下文章开头的代码实际上是如下形式:

NSObject *p1 = [NSObject new];
NSObject *p2 = [p1 retain];
NSObject *p3 = [p1 retain]
//when no longer used
[p3 release];
[p2 release];
[p1 release];

2.有返回值的方法:

ARC下:

- (NSString *)genSomeObj
{
    NSString *a = [[NSString alloc]initWithFormat:@"%@",@"ARC"];
    return a;
}
MRC下:

- (NSString *)genSomeObj1
{
    NSString *a = [[NSString alloc]initWithFormat:@"%@",@"ARC"];
    return a;
}
- (NSString *)genSomeObj2
{
    NSString *a = [[NSString alloc]initWithFormat:@"%@",@"ARC"];
    return [a autorelease];
}

- (void)main
{
    NSString *s1 = [self genSomeObj1];
    [s1 release];
    NSString *s2 = [self genSomeObj2];
    //由于autorelease,不需要调用[s2 release]
}


ARC有一个规定:以new、alloc、copy、mutableCopy开头的方法需要由调用者主动管理内存

即同样是产生一个string的方法genSomeObj和newSomeObj,在ARC下被系统补充后的实现如下:

- (NSString *)genSomeObj
{
    NSString *a = [[NSString alloc]initWithFormat:@"%@",@"ARC"];
    return [a autorelease];
}
- (NSString *)newSomeObj
{
    NSString *a = [[NSString alloc]initWithFormat:@"%@",@"ARC"];
    return a;
}

调用newSomeObj方法的地方需要生成的指针不再使用时调用一次release(当然也是系统去调)

由于genSomeObj调用了autorelease,假设调用生成的指针还要继续指向该对象(需要保留该对象),那么还需要在此retain,例如

- (void)main
{
    NSString *b = [[self genSomeObj]retain];
    //do something with b
}
...
{
...
   [b release];
...
}

3.dealloc

ARC的dealloc将调用实例变量的release(不同于MRC下开发可以随时release,所以MRC下之需要开发自己写未被release的对象即可)

4.ARC下提供的property:

property的目的是为实例变量提供了更方便的访问方式,系统会为声明为property的obj生成实例变量_obj,并且提供默认的getter\setter

假设是MRC的环境,setter会是怎样的呢?

- (void)setObj:(NSObject *)obj
{
    [_obj release];
    [obj retain];
    _obj = obj;
}

为什么会这样?

1.实例变量_obj可能会有旧值,此时它需要指向新的对象地址的,所以需要将之前对象的引用计数减1(如果_obj之前指向了某个对象)

2.新对象马上要被_obj引用,所以需要obj增加引用计数

3.开始引用(赋值操作)


property是可以有好几种形容词的,说下最常见的nonatomic,strong,weak,assgin

nonatomic:字面意思表示对象操作不具有原子性,如果不加这个形容词,那么对象的访问会被加锁

strong:属性赋值时会自动retain

weak:弱引用不会增加引用计数、会在指向的对象将要销毁时自动置为nil,防止也指针,具体可见weak的详细介绍

assgin:一般用于修饰基本类型,如果修饰对象,是不会自动进行retain操作的(不加引用计数)

5.block的使用

block是c/c++里闭包的实现,关于闭包的理解见阮一峰的blog

block分为NSStackBlock\NSGlobalBlock\NSMallocBlock:栈block,全局block,堆bock,其中栈block存储于栈,其他存储于堆

一个block在创建时属于stackblock还是globalblock,取决于block内是否使用了外部变量,在没有使用外部变量时为globalblock,有globablock的好处是对于它的很多方法都不需要实际处理,例如copy操作。

但在ARC下其实很少会使用stackblock,只要将新创建的block赋值指针,ARC下会自动进行copy操作,stackblock即化身为mallocblock。

MRC下入若执行以下代码

@interface MRCObj()
{
    void(^block)();
}

@end

@implementation MRCObj

- (void)test
{
    NSInteger i= 0;
    block = ^(){__unused NSInteger b = i;};
}

- (void)testBlock
{
    block();
}

@end

//somewhere
{
    MRCObj *mo = [MRCObj new];
    [mo test];
    [mo testBlock];
}
会由于block变量指向了一个stackblock,而方法结束后stackblock释放,再次调用则引起崩溃。

所以在MRC下则需要主动进行Block_copy、Block_release操作例如,ARC下则如上所述会自行拷贝

Tips:

亲自测试MRC运行情况可在Build Phase的Compile Sources内将该文件设为-fno-objc-arc

固定资产报废的损失鉴定怎么做? 在社会生产的日常中,企业经常会遇到固定资产报废的损失鉴定,那么怎么去做鉴定?哪些情况下能申请固定资产报废损失鉴定呢? 今天,华碧鉴定就和大家说一说固定资产报废损失鉴定那些事儿。 符合下列条件之一的固定资产可申请报废: 1、使用年限过长,功能丧失,完全失去使用价值,或不能使用并无修复价值的; 2、产品技术落后,质量差,耗能高,效率低,已属淘汰且不适于继续使用,或技术指标已达不到使用要求的; 3、严重损坏,无法修复的或虽能修复,但累计修理费已接近或超过市场价值的; 4、主要附件损坏,无. 阅读详情

相关推荐

在统信UOS Server 20上踩坑记:手把手教你搞定openGauss 5.0.0企业版安装(附常见报错解决方案)

本文详细记录了在统信UOS Server 20上安装openGauss 5.0企业版的实战经验,包括环境准备、依赖库问题、目录权限、内存参数调优等常见问题的解决方案。通过伪装系统标识、建立软链接、调整内存参数等方法,成功克服国产操作系统与企业级数据库的兼容性挑战,为开发者提供了一份深度排雷指南。

weixin_28698059的博客 262

内存管理(二) ARC

内存管理(二) ARC 上篇我们介绍了MRC,本篇我们介绍下ARC ARC概述 ARC是一种编译器功能,它通过LLVM编译器和Runtime协作来进行自动管理内存。LLVM编译器会在编译时在合适的地方为 OC 对象插入retain、release和autorelease代码来自动管理对象的内存,从而彻底解放程序员。 ARC不能解决的问题 Block等引发的循环引用问题(更多循环引用看我这篇文章) 底层 Core Foundation 对象需要手动管理 所有权修饰符 __strong __weak __

iOS随笔 3041

MoveIt2项目想换掉KDL求解器?试试这个trac_ik插件(附源码编译避坑指南)

本文详细介绍了如何在MoveIt2项目中用trac_ik插件替代KDL求解器,提升机械臂运动学求解的效率和成功率。内容涵盖环境准备、源码编译避坑、项目集成及性能调优,特别适合需要高精度控制的协作机械臂应用场景。通过实测数据对比,trac_ik在求解时间和奇异点处理上显著优于传统KDL求解器。

weixin_30730053的博客 692

ARC内存管理

ARC 内存管理: 注意三点: 一: 不要出现循环引用 二: 如果出现 Core Foundation 对象(如: CFStringRef, CTFontRef)需要使用     CFRetain(对象)、 CFRelease(对象)来管理。 另外可以通过 桥接,     桥接的三种方式 __brid

dingyanpeng的博客 623

避坑指南:英飞凌TC3XX的MCMCAN初始化常见错误及解决方法

本文针对英飞凌TC3XX系列MCU的MCMCAN模块初始化难题,深入剖析了寄存器配置时序、总线监控模式误用、中断映射错误及Message RAM地址冲突四大常见陷阱。通过实战代码示例和诊断流程,提供了清晰的避坑指南和解决方案,帮助嵌入式开发者高效解决CAN FD通信故障,确保汽车电子与工业控制项目的稳定运行。

weixin_29193259的博客 244

脑电分析:为什么大脑信号会“变同步”?——事件相关同步化与去同步化 (ERS/ERD) 全景解析

脑电分析中的事件相关同步化(ERS)和去同步化(ERD)是研究大脑动态节律的重要方法,反映特定任务下脑电频段能量的变化。ERD表示神经元活动分散(功率下降),提示脑区活跃处理信息;ERS则反映神经元同步(功率增强),常与静息状态相关。本文详解了ERS/ERD的生理机制、计算流程(包括基线校正和功率谱分析),并提供了Python实现示例,展示如何通过Welch法和STFT进行时频分析,生成ERD/ERS热力图。该技术广泛应用于运动想象脑机接口、癫痫检测等领域,为理解大脑功能状态提供了量化工具。

qq_32516809的博客 1395

自动内存管理(ARC)

/*   1. 自动释放池的原理.        存入到自动释放池中的对象,在自动释放池被销毁的时候.会自动调用存储在该自动释放池中的所有对象的release方法.        可以解决的问题:      将创建的对象,存入到自动释放池之中. 就不再需要手动的relase这个对象了.      因为池子销毁的时候 就会自动的调用池中所有的对象的relase。  

权权的博客 534

python抓取美团外卖的数据(商家、评分、评论)

本文详细介绍了如何使用Selenium和抓取美团外卖的商家、评分和评论数据。我们从基础的爬虫原理入手,分析了美团外卖的网页结构,提出了应对反爬虫机制的策略,并给出了详细的代码实现。通过使用Selenium,我们能够绕过动态加载内容的限制,直接抓取网页中的商家信息和评论。结合多线程和代理池等技术,我们可以进一步提高爬虫效率,并避免IP被封禁。未来,随着爬虫技术的发展,我们可以进一步探索深度抓取、数据清洗和数据分析等高级应用,以实现更智能的网页数据抓取。

2201_76125261的博客 2693

ARC章节的学习笔记

什么是ARC 引用计数 即OC中的内存管理, ARC即字自动引用计数,是指内存管理中对引用采取自动计数的技术,通过ARC,就可不用键入retain和release代码。 ARC状态 生成 持有 释放 飞起 内存管理的思考方式 自己生成的对象自己持有 ...

qq_44865905的博客 505

【推荐100个unity插件】unity实现交互式火焰 —— Ignis

Ignis是一款Unity互动式消防系统插件,可轻松将物体转换为可燃物。支持固体、植被、蒙皮网格和地形树木等多种对象类型,提供火焰蔓延、熄灭等效果。安装需通过Unity Package Manager添加Visual Effects Graph,并按照指引转换目标物体材质。使用盒型碰撞体或网格计算燃烧区域,可自定义火焰参数和视觉效果。内置多种转换选项,如Flammable Vegetation、Flammable Skinned Mesh等,适用于不同场景需求。注意使用前需备份材质和地形数据,并提供性能优化

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2236

2023年高教社杯 | 2023年高教社杯全国大学生数学建模思路(A题思路、C题思路)

2023年高教社杯 | 2023年高教社杯全国大学生数学建模思路(A题思路、C题思路)

前程算法屋的博客 624

Swift 开发教程系列 - 第11章:内存管理和 ARC(Automatic Reference Counting)

在 Swift 中,内存管理由 ARC(自动引用计数)机制自动处理。ARC 通过追踪和管理对象的引用计数来确保分配的内存得到有效释放。尽管 ARC 在大多数情况下能够高效地管理内存,但理解其工作原理仍然十分重要,因为不当的引用会导致内存泄漏或循环引用。本章将介绍 ARC 的基本原理、强引用和弱引用的使用、循环引用的识别和解决方法。

小创果技术交流博客 1074

锂电池SOH预测 | 基于BP神经网络的锂电池SOH预测(附matlab完整源码)

锂电池SOH预测 | 基于BP神经网络的锂电池SOH预测(附matlab完整源码)

天天酷科研的博客 1114

ARC指南2 - ARC的开启和禁止

要想将非ARC的代码转换为ARC的代码,大概有2种方式: 1.使用Xcode的自动转换工具 2.手动设置某些文件支持ARC 一、Xcode的自动转换工具 Xcode带了一个自动转换工具,可以将旧的源代码转成ARC模式 1.ARC是LLVM 3.0编译器的特性,而现有工程可能使用老的GCC 4.2或LLVM-GCC编译器,因此首先需要设置使用LLVM 3.0编译器: (现

M了个J 2万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

XCode工程中ARC模式与非ARC模式共用

Xcode 项目中经常会融合一些老的代码,它们可能采用非ARC的模式。混合编译时,就会碰到编译出错的情况。 如何共用ARC模式和非ARC模式呢? XCode除了提供整个项目是否使用ARC模式的选择外,还可以对单个文件添加标签来指定是否采用ARC模式。 添加标签的方法: 打开:你的target -> Build Phases -> Compile Sources. 双击对应的 *.m 文件

Benson的学习笔记 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

ARC简介以及工程中ARC与非ARC的混合

ARC与非ARC在一个项目中同时使用,1,选择项目中的Targets,选中你所要操作的Target,2,选Build Phases,在其中Complie Sources中选择需要ARC的文件双击,并在输入框中输入:-fobjc-arc,如果不要ARC则输入:-fno-objc-arc 混用没有问题,没有用ARC的代码继续坚持谁申请谁释放就好了。以前的库没有时间重写,都采用这种方法。...

216

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ARC 与非ARC 之间的转换,以及如何使一个项目中,ARC与非ARC共存

  1,非ARC 转 ARC的操作   XCode 的 Edit -- Refactor -- Convert to Object-C ARC (注意,一般在一个大项目中,很少直接使用此方法,其正确率有待考虑,毕竟手动内存管理较为复杂,如果出现错误,很难排查)   2,ARC 与 非ARC共存   需求来源:当我们在项目中使用一些古老的框架时,该框架就可能使用手动内存管理.而公司开...

dmsz98807的博客 238

ARC是什么

ARC是什么 ARC是iOS 5推出的新功能,全称叫 ARC(Automatic Reference Counting)。简单地说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了。 该机能在 iOS 5/ Mac OS X 10.7 开始导入,利用 Xcode4.2 可以使用该机能。简单地理解ARC,就是通过

afdl9999的专栏 958

OC开发之——ARC和非ARC转换(47)

一 概述 非ARC部分文件使用ARC 非ARC项目转换成ARC项目 ARC项目部分文件使用非ARC 二 查看项目是否是ARC项目 点击项目名称,右侧默认切换到PROJECT下的Basic标签 切换到Customized标签,在右侧输入框中输入ARC,查看Objective-C Automatic Reference Counting 右侧是Yes(ARC)还是No(非ARC) ...

我的博客 557

ios 类文件中 ARC与非ARC的设置

用-fno-objc-arc标记来禁用在ARC工程那些不支持ARC的文件的ARC 用-fobjc-arc标记启用非ARC工程中支持ARC的文件   这样就可以混合使用了

孙启超 9309

ARC

随着ios5之后,ARC的模式已经成了主流。前面我们知道ARC会自动帮助开发者去插入retain和release语句。ARC编译器有两个部分,分别为前端编译器和ARC优化器。 1. 前端编译器 前端编译器会为“拥有的”对象插入相对的release语句。如果对象的所有权修饰符是strong,那么它就是被拥有的。 a.如果在某个方法内去创建一个对象,前端编译器会在方法末尾自动插入rel...

WANLING6822的博客 196

Xcode非ARC项目转ARC,ARC项目中支持非ARC也就是共存

1. Xcode非ARC项目转ARC 选中工程》Edit > Refactor > Convert to Objective -C ARC 然后就是下一步,save保存  eable 2. ARC项目中支持非ARC也就是共存 选中工程》选择 Build Phases > 找到 Compile Sources 展开 > 找到需要的类 然后双击 > 弹出一个窗口写入   -fno-obj

itchiang的专栏 2289

ARC工程中支持ARC,ARC工程那些不支持ARC

用-fno-objc-arc标记来禁用在ARC工程那些不支持ARC的文件的ARC, 用-fobjc-arc标记启用非ARC工程中支持ARC的文件

任海丽(3G/移动开发) 1834

arc与非arc混合开发

如果你的项目使用的非ARC模式,则为ARC模式的代码文件加入-fobjc-arc标签。 如果你的项目使用的ARC模式,则为非ARC模式的代码文件加入-fno-objc-arc标签。 添加标签的方法: 1.打开:你的target - >Bulid Phases ->Compile Sources。 2.双击对应的*.m文件。 3.在弹出的窗口中输入上面提到的标签 -fobjc-arc /

风华正茂的博客 471

ios 开发中兼容非arc_iOS 开发,混合使用 ARC 和非ARC

【前提知识】ARC:Automatic Reference Counting,自动引用计数在开发 iOS 3 以及之前的版本的项目时我们要自己负责使用引用计数来管理内存,比如要手动 retain、release、autorelease 等,而在其后的版本可以使用 ARC,让系统自己管理内存。【问题】在项目开发过程中我们通常会用到第三方提供的源代码,麻烦的是有些开源项目用的是 ARC,有的用的是非 ...

weixin_29292535的博客 193
上一篇: OC:对象、类、元类
下一篇: 文件分段请求
iOSiri
博客等级 码龄10年 0粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值