写和写有什么区别
+(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];
}
写和写有什么区别
+(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];
}
存储是static
,这意味着每个进程只有一个变量,例如整个 iOS 应用程序只有一个变量。
例如,一旦你给static
变量赋值,这个值即使在函数结束后也会存在。使用局部变量时情况并非如此,分配给变量的值将在范围(例如函数)结束后消失。
从第二个示例中,obj
第二个中的 in 将始终nil
位于函数的开头,因为它被声明为局部变量。另一方面,obj
在第nil
一次调用中,仅是因为它将被分配给MyObj
第一次调用后的新实例。
使用第一种方法:调用 [WhateverClass obj] 然后再次调用 [WhateverClass obj] 将返回完全相同的 MyObj 实例。
这是因为在第一次调用 [WhateverClass obj] 时,静态 *obj 被设置为 nil。if 语句被调用并且 *obj 现在指向新初始化的实例。在随后的调用中,静态 *obj 仍然指向第一次调用的对象(即它在调用之间持续存在,并且静态 MyObj *obj = nil 未运行)。出于这个原因,你需要小心静态。在 ARC(自动引用计数)下,除非 *obj 在未来某个时间再次设置回 nil,否则该对象将继续存在于内存中,直到进程终止。
使用第二种方法: [WhateverClass obj] 和 [WhateverClass obj] 每次都会返回一个新的 MyObj 实例。此范围称为自动范围,默认行为是一旦您退出范围(一组花括号),花括号中定义的所有变量都将丢失。
进一步阅读http://nshipster.com/c-storage-classes/提供了一个很好的概述。