什么时候释放保留对象(分配给弱变量对象)

when will the retained object (that assigned to weak variable object) be released

这些代码会得到警告:将保留对象赋值给弱变量对象,赋值后会释放

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

但是nslog会正常打印1234,好像赋值后对象没有释放,那么什么时候释放呢?

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

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

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

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