__autoreleasing 修饰符

本文深入探讨了在不同情况下使用__autoreleasing修饰符和autorelease方法之间的等效性,详细解析了在作用域、内存管理及方法调用上的差异与一致性,并通过具体代码实例进行了说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将对象赋值给附有__autoreleasing 修饰符的变量等同于ARC 无效时调用对象的autorelease方法。我们通过以下源代码来看一下。

  1. @autoreleasepool {  
  2. id __autoreleasing obj = [[NSObject alloc] init];  

该源代码主要将NSObject 类对象注册到autoreleasepool 中,可作如下变换:

  1. /* 编译器的模拟代码 */  
  2. id pool = objc_autoreleasePoolPush();  
  3. id obj = objc_msgSend(NSObject, @selector(alloc));  
  4. objc_msgSend(obj, @selector(init));  
  5. objc_autorelease(obj);  
  6. objc_autoreleasePoolPop(pool); 

这与苹果的autorelease 实现中的说明(参考1.2.7 节)完全相同。虽然ARC 有效和无效时,其在源代码上的表现有所不同,但autorelease 的功能完全一样。

在alloc/new/copy/mutableCopy 方法群之外的方法中使用注册到autoreleasepool 中的对象会如何呢?下面我们来看看NSMutableArray 类的array 类方法。

  1. @autoreleasepool {  
  2. id __autoreleasing obj = [NSMutableArray array];  

这与前面的源代码有何不同呢?

  1. /* 编译器的模拟代码 */  
  2. id pool = objc_autoreleasePoolPush();  
  3. id obj = objc_msgSend(NSMutableArray, @selector(array));  
  4. objc_retainAutoreleasedReturnValue(obj);  
  5. objc_autorelease(obj);  
  6. objc_autoreleasePoolPop(pool); 

虽然持有对象的方法从alloc 方法变为objc_retainAutoreleasedReturnValue 函数, 但注册autoreleasepool 的方法没有改变,仍是objc_autorelease 函数。

转载于:https://www.cnblogs.com/zsw-1993/p/4879687.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值