【问题标题】:Pointer vs nil initialized pointer指针 vs nil 初始化指针
【发布时间】: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


    【解决方案1】:

    在 C 和 Objective C 中,变量不会自动初始化;相反,您只是被分配了内存,清除它(如有必要)成为您的责任。

    有时,这块内存已经很清晰了,但大多数时候,它被垃圾填满,从其他进程中释放了内存,或者大象在跳舞;未初始化的自动内存的内容(例如您在此处拥有的内容)是未定义的。

    永远不要假设未初始化的内存实际上可用于除赋值之外的任何事情!

    作为一个程序问题,在这两种情况下,当你真正的意思是“价值”时,你说的是“地址”。

    【讨论】:

      【解决方案2】:

      第二个表达式的结果是 clear nil == 0x0 因此 str 的值为 0x0。一般来说,第一个表达式有一个未定义的值(意思可以是任何值)。这取决于编译器未初始化变量的值。一些编译器会将未初始化的变量设置为 0 (0x0),但并非总是如此。通常,编译器不会将该值设置为任何值,并且该变量将包含您拥有的内存块的任何值。

      iOS SDK 中的 Objective-C 编译器的细节并不真正相关。最佳实践是不要假设变量获得默认初始值。因此,第二行是初始化您不打算立即使用的变量的更好方法。否则,当您更改编译器、编译器更改或变量初始化为不同值时,您可能会遇到意外行为。

      【讨论】:

        【解决方案3】:

        在 C 中,堆栈分配的变量默认情况下不会初始化为零字节,而全局变量和 Objective C 对象(使用 alloc 分配)是。

        我想这是一个性能问题,几乎所有关于 C 和派生语言的教科书都警告过它。如果您在没有先为其赋值的情况下引用局部变量,编译器也会发出警告。

        【讨论】:

        • 程序点:动态分配的内存只有在使用 calloc 或派生类时才会初始化为零,malloc 与自动内存有同样的陷阱。
        • 谢谢,我澄清了我的意思是 Obj-C 对象。
        猜你喜欢
        • 2016-11-09
        • 1970-01-01
        • 2011-04-10
        • 2021-08-02
        • 2010-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多