NSString __weak *string = [[NSString alloc] initWithFormat:@"First Name: %@", @"Braj"];
NSLog(@"string:%@", string);
NSString __weak *string2=@"Hello";
NSLog(@"string:%@", string2);
NSString __weak *string3 =[[NSString alloc]initWithString:@"Braj"];
NSLog(@"string:%@",string3);
这里,第一个字符串给出输出 null,另外两个字符串对象分别给出 ans 作为 Hello 和 Braj。 我在这里很困惑如何处理 __weak 引用。
最佳答案
“弱”意味着指针变量不包含对对象的引用,因此指针允许对象被释放。发生这种情况时,指针将设置为 nil。
所以第一个 NSLog 做了你应该期望的。没有对该对象的强引用,所以它立即变为 nil。
在第二种情况下,您有一个字符串文字。字符串文字是不同的:它们实际上从不消失。它们是使用一些巧妙的技巧创建的,这意味着如果它们被释放,则不会保存任何内存。
第三种情况:[[NSString alloc] initWithString:aString] 很聪明。如果没有必要,它实际上不会分配新字符串!如果 aString 是不可变字符串,则结果是 aString 而不是新对象。您向它传递了一个字符串文字,因此结果就是该字符串文字。回到案例 2 :-)
当其他人释放对对象的最后一个强引用时,弱引用可能变为 nil。但是你的代码永远不知道谁可能持有强引用(在幕后),所以你永远不能指望弱引用变成 nil。
关于ios - NSString 的 Objective-C ARC 和 __weak,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29869894/