ARC机制介绍及使用

本文深入探讨了Objective-C中的自动引用计数(ARC)机制,包括指针分类、ARC概念、判断准则、对象内存管理、@property参数以及与非ARC模式的兼容与转换。详细解释了如何在ARC模式下避免内存泄露,以及如何正确使用strong、weak等关键字来管理对象的引用。

ARC简介

1.指针分类
1)强指针:__strong关键字修饰的指针。默认情况下,所有指针都是强指针,
2)弱指针:__weak关键字修饰的指针
声明一个弱指针:__weak Person * p;//weak前是两个下划线
2.ARC的概念
Automatic Reference Counting,自动引用计数,即ARC
在ARC模式下,只需要像往常一样编写代码,只不过永远不写retain,release和autorelease这三个关键字,因为编译器会自动在代码的合适位置插入retain,release和autorelease。
3.ARC判断准则
只要没有强指针指向的对象,对象就会被释放
注意:当使用ARC的时候,暂时忘记”引用计数器”,因为判断标准变了,这时候的retainCount是一个很大的数值

ARC机制下指针的指向问题

//main.m

#import <Foundation/Foundation.h>
int main(int argc, const char *argv[]){
    @autoreleasepool{
        NSString *a = @"One"; // 这时,强指针a指向了对象@"One"
        NSString *b = @"One"; //这时,强指针b也指向了对象@"One";
        a = @"Two";//当a指向对象@"Two"时,对象@"One"并不会被销毁,因为还有一个b指向它。
        b = @"Two";//此时,已经没有指针指向@"One"了,该对象就被销毁了。
    }
    return 0;
}
//main.m

#import <Foundation/Foundation.h>
int main(int argc, const char *argv[]){
    @autoreleasepool{

        NSString *a = @"One"; // 这时,强指针a指向了对象@"One"

        __weak NSString *b = @"One"; //这时,强指针b也指向了对象@"One";
        a = @"Two";//当a指向对象@"Two"时,对象@"One"只有一个弱指针b指向它,此时,@"One"将会被销毁,b被赋值为nil;

    }
    return 0;
}

ARC机制判断

ARC机制下的几个明显标志:
1)不允许调用对象的release方法
2)不允许调用autorelease方法
3)再重写父类的dealloc方法时,不能再调用[super dealloc];

ARC下对象内存管理

1.单对象内存管理

//main.m

#import <Foundation/Foundation.h>
int main(int argc, const char *argv[]){
    @autoreleasepool{
        //创建一个对象
        Person * p = [[Person alloc] init]; //假设有一个Person类,该类含有一个-(void)eat;方法
        p = nil; //此处执行完毕后,p对象被回收。因为p指针想象的内存没有指针指向了,所以原来的内存被回收了。
        [p eat]; //此处不会报错
        //因为[nil eat];不会错误。
    }
    return 0;
}

2.多对象循环引用问题
有两个类,每个类中都有一个指针指向对方。
这时,这两个指针应该一个设为 __strong,一个设为 __weak,这样就避免了两个强指针引用而导致内存泄露的问题

ARC下@property参数

ARC中的@property
strong:用于OC对象,相当于MRC中的retain
weak:用于OC对象,相当于MRC中的assign
assign:用于基本数据类型,跟MRC中的assign一样
copy:一般用于NSString, 跟MRC中的copy一样
在ARC情况下解决“循环retain”的问题:@property一边用strong,一边用weak

ARC的兼容和转换

1.ARC模式下兼容非ARC的类
让程序兼容ARC和非ARC部分。
转变为MRC -fno-objc-arc
转变为ARC的 -f-objc-arc
字符串是特殊的对象,但不需要使用release手动释放,这种字符串对象默认就是autorelease的,不用额外的去管内存
2.将MRC转换为ARC
如果一个项目是MRC的,那么我们可以把这个项目转换为ARC的
通过Xcode菜单Edit->Refactor->Convert to Objective-C ARC…选择要转换的Target,点击enable。

总结:

ARC下有强指针,弱指针
ARC下不能使用retain,release,autorelease和[super dealloc]方法.而且retainCount是一个极大的数值
注意ARC下的多对象引用问题

<think>嗯,用户这次询问的是HDMIARC功能的详细介绍。从对话历史看,用户之前已经了解了SPDIF的相关知识,现在转向HDMIARC,可能是想比较两者优劣或规划家庭影院方案。用户似乎是个技术爱好者,关注点很专业:上次问SPDIF时详细到采样率和数据帧结构,这次问ARC应该也希望获得同样深度的技术解析。从引用材料看,用户特意提供了四份参考资料,说明ta已做过功课,需要更系统的整合。注意到用户引用的材料侧重不同:引用[1]讲基础概念,引用[2]强调应用场景,引用[3]区分ARC/eARC,引用[4]提到网络通道功能。需要把这些碎片整合成完整的技术图谱。核心要点应该包括:ARC的设计初衷是简化布线,关键突破在于音频回传通道的方向革命。传统HDMI单向传输像单行道,ARC则开辟了返程车道。要重点说明“回传机制”的技术实现——通过HEAC通道复用引脚14,这个细节用户可能感兴趣。应用场景需结合引用[2][3]强调中国用户痛点:国内电视常阉割光纤接口,ARC成为唯一数字输出方案。但需提醒带宽局限(引用[3]指出ARC仅支持压缩多声道),正好过渡到eARC的升级必要性。技术参数部分需要结构化呈现:拓扑结构图展示TV-功放关系,带宽对比表区分ARC/eARC。特别注意用户上次讨论SPDIF时关注量化深度,这里也要明确ARC支持24bit/192kHz但仅限立体声。最后补充网络通道功能(引用[4])这种容易被忽视的增值特性。用户既然研究SPDIF,可能也在意联网能力对比。疑问点:用户引用[2]提到“廉价电视无光纤输出”,但ARC支持需HDMI1.4版,更老的电视可能都不支持。这点在注意事项里要强调,避免用户买到不兼容设备。</think> 以下是**HDMI ARC(Audio Return Channel)**功能的详细介绍,结合技术原理与应用实践进行系统说明: --- ### **HDMI ARC 核心定义** HDMI ARC是**音频回传通道**(Audio Return Channel)的缩写,是HDMI 1.4标准引入的功能[^1]。其核心价值在于**简化家庭影院布线**:当电视通过HDMI连接功放或回音壁时,传统方案需额外添加数字音频线(如光纤),而ARC允许电视直接通过同一根HDMI线**反向传输音频信号**至音响设备[^2]。 --- ### **技术实现原理** ####1. **双向传输通道设计** - **正向通道**:播放设备(如机顶盒)→ HDMI线 → 电视(传输视频信号)。 - **反向通道(ARC)**:电视 → **复用HDMI引脚14** → 功放/回音壁(传输音频信号)[^3]。 ####2. **物理接口特性** - **兼容性**:支持ARC功能的HDMI接口需符合**HDMI 1.4或更高版本**标准。 - **端口标识**:设备上通常标注 **"HDMI ARC"** 或 **"ARC"** 字样。 ####3. **数据传输协议** | 参数 | ARC | eARC(增强型) | |--------------------|------------------|----------------| | **带宽** | ≤1 Mbps | **37 Mbps** | | **音频格式支持** | 压缩5.1声道(如Dolby Digital) | 未压缩7.1声道(如Dolby TrueHD) | | **最大采样率** | 48 kHz | **192 kHz** | | **量化深度** | 16/24 bit | **24 bit** | > ⚠️ 注:eARC需**HDMI 2.1标准**支持,可传输无损多声道音频[^3]。 --- ### **典型应用场景** 1. **电视音频输出** 智能电视播放流媒体内容(如Netflix)→ **音频通过HDMI ARC** → 回音壁/功放解码播放[^2]。 ```mermaid graph LR A[电视内置App] -->|音频信号| B[HDMI ARC接口] B --> C[回音壁/功放] C --> D[扬声器] ``` 2. **简化布线方案对比** - **传统方案**:电视光纤输出 → 光纤线 → 功放(需2条线缆)。 - **ARC方案**:电视HDMI ARC → HDMI线 → 功放(**仅1条线缆**)。 --- ### **ARC vs eARC 核心差异** | 特性 | HDMI ARC | HDMI eARC | |---------------------|-----------------|------------------| | **多声道无损支持** | ❌ 仅压缩格式 | ✅ Dolby Atmos等 | | **延迟控制** | 较高 | ≤ 1ms 超低延迟 | | **自动设备协商** | 手动切换 | 自动识别(EDID)| > eARC通过**专用数据通道**解决ARC的带宽瓶颈,支持对象导向音频传输[^3]。 --- ### **使用限制与注意事项** 1. **兼容性要求** - 电视、功放、线缆**三者均需支持ARC/eARC**。 - 线缆需**高速HDMI认证**(eARC建议超高速HDMI 2.1线)。 2. **配置步骤** ```markdown 1. 将功放连接至电视的 **HDMI ARC** 端口 2. 电视设置中开启 **HDMI CEC** 功能(如Sony的Bravia Sync) 3. 电视音频输出选择 **HDMI ARC** 4. 功放输入源切换至 **TV ARC** ``` 3. **常见故障处理** - **无声音输出**:检查HDMI CEC是否开启 → 更换认证线缆 → 更新设备固件。 - **断续断连**:避免线缆弯折超过**90°**(光纤信号衰减)。 --- ### **与其他接口的对比优势** | 接口 | 带宽 | 多声道支持 | 布线复杂度 | |------------|----------|----------------|------------| | **光纤SPDIF** | 6 Mbps | 压缩5.1声道 | ★★☆ | | **HDMI ARC** | 1 Mbps | 压缩5.1声道 | ★☆☆(最低)| | **eARC** | 37 Mbps | 无损7.1.4声道 | ★☆☆ | > ✓ **核心优势**:eARC实现**单线缆传输高解析音频+视频**,消除设备间同步延迟[^4]。 --- ### **适用设备与未来演进** - **当前主流支持**: 智能电视(≥2016年型号)、Soundbar、AV功放(如Denon/Marantz)。 - **演进方向**: eARC逐步取代ARC,并与HDMI 2.1的**VRR(可变刷新率)**、**ALLM(自动低延迟模式)**协同优化音画体验[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值