0

我有一个我认为可能很弱的属性。但除非设置为强,否则它不会显示。

这:

- (void) setTimeAndLocation:(Message *)activity{
    __weak NSString *time = [[[activity getPropertyByPath:@"StartTime"] value] substringWithRange:NSMakeRange(0, 5)];
    NSLog(@"Time: %@", time); // null

    __strong NSString *time = [[[activity getPropertyByPath:@"StartTime"] value] substringWithRange:NSMakeRange(0, 5)];
    NSLog(@"Time: %@", time); // works, 20:30

    __weak NSString *time = [[activity getPropertyByPath:@"StartTime"] value];
    NSLog(@"Time: %@", time); // works, 20:30:00
}

这是因为 substring 创建了一个新字符串或类似的东西吗?我知道我不必添加 __weak 或 __strong 但这对我了解所有内容的作用非常有帮助

4

1 回答 1

4

time是局部变量,而不是属性。

通常,所有局部变量都是__strong(省略修饰符时的默认值),因为它们在超出范围时会自动释放。

您永远不会为新创建的对象声明局部变量__weak,因为该对象将在创建后立即被销毁。substringWithRange:正如您所提到的,我怀疑这会创建一个新对象。

第二个有效的事实具有误导性。当你声明一个局部变量__weak时,除非你知道你正在访问一个在别处强烈保留的对象,否则你不能保证它是可用的。在这两种情况下,变量都应该是__strong(无修饰符)。


__weak当您要创建先前创建的对象的弱局部变量时使用,该对象在其他地方被强引用。通常,__weak如果您希望避免保留块内的保留循环,则使用变量。

于 2013-11-11T15:30:25.973 回答