一个奇怪的事情,和自己的推理

本文通过两个示例探讨了ARC环境下Block对弱引用对象的影响。第一个示例中,即使强引用对象被设置为nil,弱引用对象仍能在Block中访问。第二个示例则展示了弱引用对象在不同情况下的行为差异。

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

一个奇怪的事情,和自己的推理

有如下代码

 @interface AA : NSObject
 @property (strong) NSString *string;
 @end
 @implementation AA
 - (void)dealloc {
     NSLog(@"%@ dealloc", self.string);
 }

@end

 - (void)testArcSimple {
     AA * __strong aa_weak_holder = [[AA alloc] init];
     AA * __weak aa_weak = aa_weak_holder;
     aa_weak_holder.string = @"aa_weak";
     void (^aBlock)(void) = ^(){
         NSLog(@"block : %@", aa_weak.string);

};

     aa_weak_holder = nil;

aBlock();}

上面的输出是:

block : aa_weak
aa_weak dealloc 

而下面这段代码:

 AA * __strong aa_weak_holder = [[AA alloc] init];
 aa_weak_holder.string = @"weak";
 AA * __weak aa_weak = aa_weak_holder;
 aa_weak_holder = nil;
 NSLog(@"aa : %@", aa_weak);

输出为:

 weak dealloc
 aa : (null)

表面看来好像是aa_weak

     void (^aBlock)(void) = ^(){
         NSLog(@"block : %@", aa_weak.string);

};

的位置[[aa_weak retain] autorelease]了一遍。

自己的推断:

在程序中使用block的时候,编译器在运行时会在整个block生命周期里面为所有的block引用变量保留一个副本。虽然aa_weak_holder被指向了nil,但是由于系统为block里面引用的变量保留了一个副本,aa_weak指向的对象并没有被立即销毁,所以可以打印出对象里面的内容。


PS:以上是本人自己的理解和推断,如有误导,敬请指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值