【发布时间】:2011-01-07 10:37:14
【问题描述】:
只是想更好地理解 ObjectiveC。
这两个表达式不应该一样吗?
NSString *str; //address of str is 0x438a5625
NSString *str=nil; //address of str is 0x0
这种行为的原因是什么?
【问题讨论】:
标签: iphone objective-c pointers nsstring
只是想更好地理解 ObjectiveC。
这两个表达式不应该一样吗?
NSString *str; //address of str is 0x438a5625
NSString *str=nil; //address of str is 0x0
这种行为的原因是什么?
【问题讨论】:
标签: iphone objective-c pointers nsstring
在 C 和 Objective C 中,变量不会自动初始化;相反,您只是被分配了内存,清除它(如有必要)成为您的责任。
有时,这块内存已经很清晰了,但大多数时候,它被垃圾填满,从其他进程中释放了内存,或者大象在跳舞;未初始化的自动内存的内容(例如您在此处拥有的内容)是未定义的。
永远不要假设未初始化的内存实际上可用于除赋值之外的任何事情!
作为一个程序问题,在这两种情况下,当你真正的意思是“价值”时,你说的是“地址”。
【讨论】:
第二个表达式的结果是 clear nil == 0x0 因此 str 的值为 0x0。一般来说,第一个表达式有一个未定义的值(意思可以是任何值)。这取决于编译器未初始化变量的值。一些编译器会将未初始化的变量设置为 0 (0x0),但并非总是如此。通常,编译器不会将该值设置为任何值,并且该变量将包含您拥有的内存块的任何值。
iOS SDK 中的 Objective-C 编译器的细节并不真正相关。最佳实践是不要假设变量获得默认初始值。因此,第二行是初始化您不打算立即使用的变量的更好方法。否则,当您更改编译器、编译器更改或变量初始化为不同值时,您可能会遇到意外行为。
【讨论】:
在 C 中,堆栈分配的变量默认情况下不会初始化为零字节,而全局变量和 Objective C 对象(使用 alloc 分配)是。
我想这是一个性能问题,几乎所有关于 C 和派生语言的教科书都警告过它。如果您在没有先为其赋值的情况下引用局部变量,编译器也会发出警告。
【讨论】: