2016-12-16 78 views
0

这些代码将得到一个警告:分配保留对象弱变量对象将分配时会保留对象(被分配给弱变量对象)发布

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

之后被释放,但NSLog的将打印1234通常情况下,似乎该对象不会在分配后被释放,所以何时释放会发生?

回答

2

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

setting environment variable in scheme

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

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

你可以阅读更多关于标签指针字符串in this excellent article by Mike Ash

+0

感谢@rob现在我明白了,我想知道为什么保留对象在被分配给弱对象时立即释放,对此的任何文档? – ximmyxiao

+0

检出http://stackoverflow.com/a/9747451/77567或http://stackoverflow.com/a/36783748/77567 –

+0

请注意,如果字符串是静态的(例如:@“xyz”),它可能位于在__const节中,所以保留/释放操作就像标记指针一样没有操作。 – russbishop

相关问题