如果我有一段像这样的代码:
- (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的代码中,人们通常认为这两种形式(stringWithFormat
和alloc/initWithFormat
)是等效的。所以我的问题是,像第二个示例这样的代码在ARC下是否有保证能够正常工作。也就是说,如果我通过我们通常认为的自动释放方便构造函数获得一个对象的弱引用,那么在与没有ARC的情况下相同的范围内使用该引用是否保证是安全的(即直到该方法退出)?
__weak
是一种相对无效的控制实例生命周期的方法。如果您明确想要控制项目的生命周期,请使用分配给强引用的+alloc
形式。然后在退出时将该引用设置为nil。将引用设置为nil是新的-release
。在我看来,__weak
仅用于打破保留循环,没有其他作用。安德鲁 P.S.有了ARC,我们应该都可以“放松身心,想着英格兰”。 - adonoho