Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如果在+;sharedInstance方法。。?_Ios_Objective C_Iphone_Singleton - Fatal编程技术网

Ios 如果在+;sharedInstance方法。。?

Ios 如果在+;sharedInstance方法。。?,ios,objective-c,iphone,singleton,Ios,Objective C,Iphone,Singleton,如果在+sharedInstance方法之前调用singleton类的init方法,会发生什么。。?这会产生一个新的对象吗?如果不是,那么如何返回相同的实例?静态变量在sharedInstance中声明的事实将对总体结果产生任何影响 + (LibraryAPI*)sharedInstance { // 1 static LibraryAPI *_sharedInstance = nil; // 2 static dispatch_once_t oncePredi

如果在+sharedInstance方法之前调用singleton类的init方法,会发生什么。。?这会产生一个新的对象吗?如果不是,那么如何返回相同的实例?静态变量在sharedInstance中声明的事实将对总体结果产生任何影响

+ (LibraryAPI*)sharedInstance
{
    // 1
    static LibraryAPI *_sharedInstance = nil;

    // 2
    static dispatch_once_t oncePredicate;

    // 3
    dispatch_once(&oncePredicate, ^{
        _sharedInstance = [[LibraryAPI alloc] init];
    });
    return _sharedInstance;
}

这取决于init方法的实现方式。默认情况下,可以使用init创建新对象。为了防止创建此类的实例,可以在init方法中返回nil,并为类创建私有初始值设定项

-(instancetype)init {
    return nil;
}

-(instancetype)localInit {
    if(!self) {
        self = [super init];
    }
    return self;
}
那么这条线呢

_sharedInstance = [[LibraryAPI alloc] init];
将改为

_sharedInstance = [[LibraryAPI alloc] localInit];

在Objective-C中,类的init方法只是带有“init”前缀的方法。这是objc和swift最大的区别之一。所以,如果调用init方法,这是错误的,但当init方法成功返回时,无疑会初始化一个新实例


函数中的静态变量在调用之间保持其值。因此,每次调用方法
sharedInstance
时,它都会给出相同的实例。关于静态变量的更多信息请检查

看看这个,这样我就不清楚你的问题了。如果我调用[[LibraryAPI alloc]init]5次,它将创建并返回5个对象。但是如果我调用[LibraryAPI sharedInstance],它将始终返回singleton对象。在这种情况下,“\u sharedInstance=[[LibraryAPI alloc]init];”行不也会收到nil作为返回吗?你说得对!我将删除代码示例。基本上,您可以编写另一个init方法,该方法无法从类外部访问-->I update my answer。