静态变量的Objective-C内存管理

静态变量的Objective-C内存管理,objective-c,Objective C,各位专家,我只想知道myClass是一个静态的ObjC对象,当不再有人引用它时,它会被ARC自动释放,所以不会有内存泄漏?是否正确?这里是一个单例类实例的示例,如果需要,您可以在整个应用程序中使用它。它永远不会发布,也不打算发布 ///************************** // MyClass.m #import "MyClass.h" static MyClass *myClass = NULL; @implementation MyClass (My

各位专家,我只想知道myClass是一个静态的ObjC对象,当不再有人引用它时,它会被ARC自动释放,所以不会有内存泄漏?是否正确?

这里是一个单例类实例的示例,如果需要,您可以在整个应用程序中使用它。它永远不会发布,也不打算发布

///**************************
// MyClass.m
#import "MyClass.h"

static MyClass *myClass = NULL;

@implementation MyClass
 (MyClass *)sharedMyClass {
 myClass = NULL;
 myClass = [[MyClass alloc] init];
 return myClass;
}

@end
这就是接口,因此您可以通过
MyClass.singleton
访问它。实现是这样的。
dispatch\u once
fluff的原因是,在一个可以同时从多个地方访问的环境中,它是安全的

@interface MyClass : NSObject

+ ( MyClass * ) singleton;

@end

请注意,这也依赖于静态变量。该变量从创建时一直保留到永久,否则应用程序将退出。

静态MyClass*MyClass
创建对存储在该值中指针的引用。只要
myClass
持有有效的对象地址,该对象就不会被释放。基本上,该变量将+1添加到存储对象的引用计数中。如果希望该对象更改为取消分配,则必须更改此变量的值以指向其他对象(或返回到
nil


作为旁注,Objective-C中的
static
与类成员的静态修饰符无关,在C/Objective-C中
static
表示其他文件看不到的符号,例如Swift中的
fileprivate
一个。

您应该查看
dispatch\u once
模式。这里要注意的是,在
static MyClass*MyClass
中有一个指向类的强指针,因此除非将其设置为
nil
,否则它将永远不会被释放。但这并不是真正的泄漏,因为,大概对于这种事情,你需要在应用程序的整个生命周期中准备一些类的实例?谢谢,skaak。我打算写这段代码,而不是dispatch_one,我只想测试如果静态变量为nil,ARC是否会自动释放它。e、 SharedCyclass将被多次调用…所以你说“除非你将其设置为nil,否则它将永远不会被释放”,这意味着ARC应该释放myClass,对吗?Hi DT。。。是的,如果您显式地将其设置为nil,并且没有任何其他内容(强)保留它,那么它将被释放。我曾经提到过派遣,因为你似乎需要一个单身汉。这是很正常的,但通常情况下发生的方式有点不同。当然,现在您所做的也很好(也很常见),但有时您会创建一个类实例并访问它,例如,默认的文件管理器、标准用户首选项或默认的通知中心。我相信你知道我说的是哪门课。。。。所有这些单例都需要比一个静态变量走得更远一点,了解如何做到这一点是很好的。我将发布一个示例来说明这一点。
@implemenation MyClass ()

+ ( MyClass * ) singleton
{
    static MyClass * a;
    static dispatch_once_t t;
    
    dispatch_once ( & t, ^ {
        
        a = [[MyClass alloc] init];

    } );

    return a;
}

@end