试图更好地理解ObjectiveC。
这两个表达式不应该相同吗?
NSString *str; //address of str is 0x438a5625
NSString *str=nil; //address of str is 0x0
这种行为的原因是什么?
答案 0 :(得分:9)
在C中,因此在Objective C中,变量不会自动初始化;但是,你只是被分配了记忆,清除它(如有必要)成为你的责任。
有时候,这个记忆已经很清楚了,但大多数时候,它充满了垃圾,从其他过程中释放了记忆,或者大象在跳动罐头;未初始化的自动存储器的内容(例如你在这里所拥有的)是未定义的。
永远不要假设未初始化的内存实际上可用于除了为其分配值之外的任何内容!
作为程序问题,在这两种情况下,当你真正意味着“价值”时,你会说“地址”。
答案 1 :(得分:3)
第二个表达式的结果是nil == 0x0,因此str的值是0x0。通常,第一个表达式具有未定义的值(意味着可以具有任何值)。它取决于编译器未初始化变量的值。有些编译器会将未初始化的变量设置为0(0x0),但情况并非总是如此。通常,编译器不会将值设置为任何值,变量将包含您获得的内存块的任何值。
iOS SDK中Objective-C编译器的细节并不真正相关。最佳做法是不假设变量获得默认初始值。因此,第二行是一种更好的方法来初始化您不打算立即使用的变量。否则,当您更改编译器,编译器更改或将变量初始化为其他值时,您可能会遇到意外行为。
答案 2 :(得分:1)
在C中,默认情况下堆栈分配的变量没有初始化为零字节,而全局和Objective C对象(用alloc分配)是。
我认为这是一个性能问题,并且它几乎在C和派生语言的每本教科书中都被警告过。如果您首先引用局部变量而不为其赋值,编译器也应该发出警告。