【发布时间】:2012-02-08 22:54:36
【问题描述】:
如果我有一段看起来像这样的代码:
- (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(即直到方法退出)?
【问题讨论】:
-
有趣的问题,但我怀疑最好的答案是“你不应该关心”。
-
你可能是对的。这个问题实际上只是为了确保我理解我所看到的其他一些问题的答案。
-
UIAdam,我和凯文一起做这个。让编译器担心内存分配。
__weak是控制实例生命周期的一种有些无效的方法。如果您明确想要控制项目的生命周期,则使用分配给强引用的+alloc表单。然后在退出时取消该引用。 Nil-ling 引用是新的-release。 IMO,__weak用于打破保留周期,仅此而已。安德鲁 P.S.有了 ARC,我们都应该“躺下来想想英格兰”。 -
是的,我同意...我在问这个问题时想到的真实代码实际上确实涉及打破保留周期。
标签: objective-c automatic-ref-counting