了解iOS中的ARC

时间:2015-03-17 02:02:36

标签: ios automatic-ref-counting grand-central-dispatch weak-references

我已经编写了这段代码来测试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);
    });
}

1 个答案:

答案 0 :(得分:0)

两个考虑因素:

  1. 您正在创建一个自动释放对象,该对象在池耗尽之前不会释放。如果您创建一个非自动释放对象(或使用您自己的自动释放池),您将看不到该行为,例如:

    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);
    });
    
  2. 您始终应该谨慎使用NSString评估内存行为。在这种情况下,我认为这不重要,但在其他情况下NSString会进行各种可能影响行为的优化和缓存。我建议使用NSObjectNSObject子类进行测试。