Objective-c中静态和非静态变量之间的范围差异

时间:2013-06-09 01:13:24

标签: ios objective-c

写作

之间有什么区别
+(MyObj*)obj
{
    static MyObj *obj= nil;
    if(!obj)
       obj = [[super allocWithZone:nil] nil];
}

+(MyObj*)obj
{
    MyObj *obj= nil;
    if(!obj)
       obj = [[super allocWithZone:nil] nil];
}

2 个答案:

答案 0 :(得分:1)

存储空间为static,这意味着每个进程只有一个变量,例如iOS应用程序中只有一个变量。

例如,一旦为static变量赋值,即使在函数结束后,该值也会存在。使用局部变量时不是这种情况,分配给变量的值在作用域结束后将消失,例如功能

从第二个示例开始,第二个示例中的obj在函数开头始终为nil,因为它被声明为局部变量。另一方面,第一个呼叫中的obj仅在第一次呼叫时为nil,因为它会在首次呼叫后被分配到MyObj的新实例。

答案 1 :(得分:0)

使用第一种方法: 调用[WhateverClass obj]然后再次调用[WhateverClass obj]将返回完全相同的MyObj实例。

这是因为在第一个[WhateverClass obj]调用中,static * obj被设置为nil。调用if语句,* obj现在指向新的initalized实例。在随后的调用中,static * obj仍指向第一次调用的对象(即它在调用之间持续存在,并且不运行静态MyObj * obj = nil)。因此,您需要小心静态。在ARC(自动引用计数)下,除非* obj在将来的某个时间再次设置为nil,否则此对象将继续存在于内存中,直到进程终止。

使用第二种方法: [WhateverClass obj]和[WhateverClass obj]每次都会返回一个新的MyObj实例。 此范围称为自动,默认行为是,一旦退出范围(一组花括号),括号中定义的所有变量都将丢失。

进一步阅读http://nshipster.com/c-storage-classes/给出了很好的概述。