这些代码会收到警告:分配保留对象到弱变量对象将在赋值后释放
__weak NSString *str = [[NSString alloc] initWithFormat:@"1234"];
NSLog(@"url:%@",str);
但是nslog会正常打印1234,似乎对象在赋值后没有被释放,所以什么时候发布会发生?
答案 0 :(得分:2)
通过在程序环境中将OBJC_DISABLE_TAGGED_POINTERS
设置为YES
,您可以获得所期望的行为。例如,您可以在Xcode中的方案中设置它,如下所示:
正在进行的操作(如果您不设置该环境变量)是Objective-C运行时支持标记指针字符串。这意味着短字符串的公共字符完全在64位对象引用中编码,存储在str
变量中。没有堆分配。由于字符串没有堆分配,并且由于字符串本身不能引用其他对象,因此运行时知道它实际上并不需要安排__weak
变量设置为nil,所以它没有。
通过设置该环境变量,可以禁用所有标记指针,包括标记指针字符串。所以我不推荐它用于生产代码。
您可以阅读有关标记指针字符串in this excellent article by Mike Ash的更多信息。