我有一个我认为可能很弱的财产。但除非设置为强,否则它不会显示。
此:
- (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,但这对我来说非常有用,可以了解所有内容
答案 0 :(得分:4)
time
是一个局部变量,而不是属性。
通常,所有局部变量都是__strong
(这是省略修饰符时的默认值),因为它们在超出范围时会自动处理。
您永远不会为新创建的对象声明局部变量__weak
,因为该对象将在创建后立即销毁。我怀疑substringWithRange:
会像你提到的那样创建一个新对象。
第二个工作的事实是误导。声明局部变量__weak
时,除非您知道正在访问其他地方强烈保留的对象,否则无法保证它可用。在这两种情况下,变量应为__strong
(无修饰符)。
__weak
。通常,如果您希望避免在保留块内保留循环,则使用__weak
变量。