写作
之间有什么区别+(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];
}
答案 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/给出了很好的概述。