iOS为什么这个属性需要很强大

时间:2013-11-11 15:26:56

标签: ios objective-c

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

此:

- (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,但这对我来说非常有用,可以了解所有内容

1 个答案:

答案 0 :(得分:4)

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

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

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

第二个工作的事实是误导。声明局部变量__weak时,除非您知道正在访问其他地方强烈保留的对象,否则无法保证它可用。在这两种情况下,变量应为__strong(无修饰符)。


当您想要创建以前在其他地方强引用的先前创建的对象的弱局部变量时,使用

__weak。通常,如果您希望避免在保留块内保留循环,则使用__weak变量。