我正在学习Objective-C和Cocoa并且遇到过这样的声明:
Cocoa框架期望全局字符串常量而不是字符串文字用于字典键,通知和异常名称,以及一些带字符串的方法参数.
我只使用更高级别的语言,所以从来没有必要考虑字符串的细节.字符串常量和字符串文字之间有什么区别?
根据ARCin iOS,一个对象必须至少有一个strong引用留在内存中,当没有strong引用时(即引用计数变为0),该对象将从内存中释放,我们将不再访问该对象.
但我的代码中出现了奇怪的行为.
我在代码中分配weak引用NSString,当我写[[NSString alloc] init]; Xcode时发出警告.
__weak NSString *str;
str = [[NSString alloc] init];
Run Code Online (Sandbox Code Playgroud)
将保留对象分配给弱属性; 对象将在分配后释放.

如果我这样做,Xcode不会发出任何警告,
__weak NSString *str;
str = @"abcd";
NSLog(@"%@",str);
Run Code Online (Sandbox Code Playgroud)

输出:abcd

我的问题是
为什么它打印"abcd"作为输出.即使str是弱参考变量.谁在保持这个NSString对象的值在内存中是"abcd"?