ios - NSString 的 Objective-C ARC 和 __weak

标签 ios automatic-ref-counting

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/

相关文章:

ios - 协议(protocol) 'loadAceessToken' 中的方法 'FHSTwitterEngineAccessTokenDelegate' 未实现

ios - 在 iOS 应用程序中调用电话

ios - 在 xcode 中禁用整个嵌套项目的 ARC

objective-c - 我可以安全地使用这个弱自自动类型的快捷方式吗?

ios - 在方法中对变量使用弱限定符

objective-c - 自动引用计数 : Pointer to non-const type 'NSError *' with no explicit ownership

objective-c - iphone 应用程序 : drag drop UIImageView

php - Openssl RSA加密-解密

Objective-C 将对象声明为与我声明的完全不同的类

iphone - 如何从自定义 UITableview 中检索有关选择单元格的数据