何时释放保留的对象(分配给弱变量对象)

时间:2016-12-16 06:54:55

标签: ios automatic-ref-counting

这些代码会收到警告:分配保留对象到弱变量对象将在赋值后释放

__weak NSString *str = [[NSString alloc] initWithFormat:@"1234"];
NSLog(@"url:%@",str);

但是nslog会正常打印1234,似乎对象在赋值后没有被释放,所以什么时候发布会发生?

1 个答案:

答案 0 :(得分:2)

通过在程序环境中将OBJC_DISABLE_TAGGED_POINTERS设置为YES,您可以获得所期望的行为。例如,您可以在Xcode中的方案中设置它,如下所示:

setting environment variable in scheme

正在进行的操作(如果您设置该环境变量)是Objective-C运行时支持标记指针字符串。这意味着短字符串的公共字符完全在64位对象引用中编码,存储在str变量中。没有堆分配。由于字符串没有堆分配,并且由于字符串本身不能引用其他对象,因此运行时知道它实际上并不需要安排__weak变量设置为nil,所以它没有。

通过设置该环境变量,可以禁用所有标记指针,包括标记指针字符串。所以我不推荐它用于生产代码。

您可以阅读有关标记指针字符串in this excellent article by Mike Ash的更多信息。