ios - ARC如何知道保留单例对象?

标签 ios objective-c automatic-ref-counting

当我们编写非 ARC 代码来创建单例类时,它是这样的:

myclass * myc_ins = nil;
@implementation myclass
+(myclass *) getInstance {
    if(!myc_ins) 
        myc_ins = [[myclass alloc] init];
    return myc_ins;
}
// ...

但是,如果在 ARC 中编写相同的代码,它会释放该对象,并且在一段时间后调用 getInstance 时,它​​会返回一些悬空指针,因为所指向的内存被释放。 另外,我还看到了 ARC 应用程序的代码:

myclass *_instance = nil;
+ (myclass *)sharedInstance {
    static dispatch_once_t _onceToken = 0;
    dispatch_once(&_onceToken, ^{
        myclass = [[myclass alloc] init];
    });
    return _instance;
}

虽然dispatch_once中的代码只执行一次,但在这种情况下编译器如何知道保留_instance变量?

最佳答案

在 ARC 定义中 myclass *_instance; 表示对 myclass 对象的强引用。因此,每次对 _instance 的赋值都会保留对象。 您的代码几乎没有更正:

static myclass *_instance = nil;

+ (myclass *)sharedInstance {
    static dispatch_once_t _onceToken = 0;
    dispatch_once(&_onceToken, ^{
       _instance = [[myclass alloc] init];
       });
    return _instance;
}

关于ios - ARC如何知道保留单例对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23442262/

相关文章:

objective-c - 在一个 UIWebView 中加载图像和文本

objective-c - 在哪里设置自动引用计数 - xcode 4.2

objective-c - ARC 迁移器在其他目标中返回错误

ios - 使用 ARC GPUImage 的内存泄漏

python - Django 中有类似 NSUserDefaults 的东西吗?

ios - PickerView 根据选择器选择返回特定的文本字符串

ios - 来自 Firebase 的数组不会附加

ios - CLLocationManager 未确定位置

Objective-c 问题通过循环遍历数组来求和

ios - 在设置包中,对开关切换类型执行操作以隐藏或更改设置包 ios 中另一个字段的字段类型