我已经编写了这段代码来测试ARC。我将字符串s2设置为弱,并将其赋值为s1。然后,我将s1设置为nil。我假设由于此后台块稍后执行,所以s2将在那时被释放。但是,当我运行此代码时,NSLog仍然将s2的值打印为“123”。有人可以向我解释为什么会这样吗?
- (void)testARC {
NSString *s1 = [NSString stringWithFormat:@"123"];
__weak NSString *s2 = s1;
s1 = nil;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
// what will NSLog print?
NSLog(@"s2 = %@", s2);
});
}
答案 0 :(得分:0)
两个考虑因素:
您正在创建一个自动释放对象,该对象在池耗尽之前不会释放。如果您创建一个非自动释放对象(或使用您自己的自动释放池),您将看不到该行为,例如:
NSString *s1 = [[NSString alloc] initWithFormat:@"123"];
__weak NSString *s2 = s1;
s1 = nil;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
// what will NSLog print?
NSLog(@"s2 = %@", s2);
});
您始终应该谨慎使用NSString
评估内存行为。在这种情况下,我认为这不重要,但在其他情况下NSString
会进行各种可能影响行为的优化和缓存。我建议使用NSObject
或NSObject
子类进行测试。