gpt4 book ai didi

objective-c - 带有 ARC 的弱局部变量的生命周期

转载 作者:太空狗 更新时间:2023-10-30 03:51:22 25 4
gpt4 key购买 nike

如果我有一段代码是这样的:

- (void)testSomething
{
__weak NSString *str = [[NSString alloc] initWithFormat:@"%@", [NSDate date]];
NSLog(@"%@", str);
}

输出将是 (null) 因为没有对 str 的强引用,它会在我分配后立即释放。这是有道理的,在过渡到 ARC 指南中有详细说明。

如果我的代码是这样的:

- (void)testSomething
{
__weak NSString *str = [NSString stringWithFormat:@"%@", [NSDate date]];
NSLog(@"%@", str);
}

然后它正确地打印出当前日期。显然,您会希望它在非 ARC 世界中工作,因为 str 将自动释放,因此在该方法退出之前有效。然而,在支持 ARC 的代码中,人们通常认为这两种形式(stringWithFormatalloc/initWithFormat)是等价的。

所以我的问题是像第二个例子这样的代码是否能保证在 ARC 下工作。也就是说,如果我对一个对象有一个弱引用,而这个对象是通过我们通常认为的自动释放便利构造函数获得的,那么保证在我通常会使用的相同范围内安全地使用该引用吗没有 ARC(即直到方法退出)?

最佳答案

自动释放和分配的约定仍然适用在 ARC 的世界中。唯一的区别是 ARC 将插入额外的保留/释放调用,以使其更难泄漏对象或访问已释放的对象。

在这段代码中:

__weak NSString *str = [[NSString alloc] initWithFormat:@"%@", [NSDate date]];

对象唯一被保留(或等效)的地方是分配。 ARC 将自动插入一个释放命令,使其立即被释放。

同时,在这段代码中:

 __weak NSString *str = [NSString stringWithFormat:@"%@", [NSDate date]];

按照约定,像这样的便捷构造函数的返回值必须是一个自动释放的对象*。这意味着当前的 autoreleasepool 已经保留了该对象,并且在池被耗尽之前不会释放它。因此,您几乎可以保证该对象至少在您的方法期间存在 - 尽管您可能不应该依赖这种行为。

(*或以其他方式保留)

关于objective-c - 带有 ARC 的弱局部变量的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9202810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com