UIA*_*dam 5 objective-c automatic-ref-counting
如果我有一段看起来像这样的代码:
- (void)testSomething
{
__weak NSString *str = [[NSString alloc] initWithFormat:@"%@", [NSDate date]];
NSLog(@"%@", str);
}
Run Code Online (Sandbox Code Playgroud)
输出将为(null),因为没有对str的强引用,它将在我分配后立即释放.这是有道理的,并在"过渡到ARC"指南中详细说明.
如果我的代码如下所示:
- (void)testSomething
{
__weak NSString *str = [NSString stringWithFormat:@"%@", [NSDate date]];
NSLog(@"%@", str);
}
Run Code Online (Sandbox Code Playgroud)
然后它正确打印出当前日期.显然你会期望它在非ARC世界中工作,因为它str会被自动释放,因此在此方法退出之前有效.但是,在启用ARC的代码中,人们通常认为两种形式(stringWithFormat&alloc/initWithFormat)是等价的.
所以我的问题是,第二个例子的代码是否可以保证在ARC下工作.也就是说,如果我有一个弱引用的对象,我通过什么我们通常会考虑一个自动释放便捷构造得到的,是它保证是安全的使用该引用在同一范围内,我通常会对没有ARC(即,直到方法退出)?
自动释放和分配的惯例仍然适用于ARC的世界.唯一的区别是ARC将插入额外的保留/释放调用,以使泄漏对象或访问解除分配的对象更加困难.
在这段代码中:
__weak NSString *str = [[NSString alloc] initWithFormat:@"%@", [NSDate date]];
Run Code Online (Sandbox Code Playgroud)
保留对象(或等效对象)的唯一位置是alloc.ARC将自动插入一个释放命令,使其立即被释放.
同时,在这段代码中:
__weak NSString *str = [NSString stringWithFormat:@"%@", [NSDate date]];
Run Code Online (Sandbox Code Playgroud)
按照惯例,像这样的便利构造函数的返回值必须是自动释放的对象*.这意味着当前的autoreleasepool已保留该对象,并且在池耗尽之前不会释放它.因此,您几乎可以保证此对象至少在您的方法持续时间内存在 - 尽管您可能不应该依赖此行为.
(*或以其他方式保留)
| 归档时间: |
|
| 查看次数: |
3297 次 |
| 最近记录: |