1

写和写有什么区别

+(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];
}
4

2 回答 2

1

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

例如,一旦你给static变量赋值,这个值即使在函数结束后也会存在。使用局部变量时情况并非如此,分配给变量的值将在范围(例如函数)结束后消失。

从第二个示例中,obj第二个中的 in 将始终nil位于函数的开头,因为它被声明为局部变量。另一方面,obj在第nil一次调用中,仅是因为它将被分配给MyObj第一次调用后的新实例。

于 2013-06-09T01:48:00.100 回答
0

使用第一种方法:调用 [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/提供了一个很好的概述。

于 2013-06-09T01:17:59.403 回答