objective-c - oc單例的一些問題
给我你的怀抱
给我你的怀抱 2017-04-28 09:05:51
0
2
676

第一種不能在全域使用...沒有值。第二種可以..搞不清楚原理阿

1.+ (User *)shareUser {

static User *_sharedSingleton = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
    _sharedSingleton = [[self alloc] init];
});
return _sharedSingleton;

}

2.static User *_sharedSingleton = nil;

@implementation User

  • (User *)shareUser {
    static dispatch_once_t predicate;
    dispatch_once(&predicate, ^{

       _sharedSingleton = [[self alloc] init];

    });
    return _sharedSingleton;
    }

  • (id)allocWithZone:(NSZone *)zone
    {
    if (_sharedSingleton == nil) {

       _sharedSingleton = [super allocWithZone:zone];

    }
    return _sharedSingleton;
    }

  • (id)copyWithZone:(NSZone *)zone
    {
    return _sharedSingleton;
    }

给我你的怀抱
给我你的怀抱

全部回覆(2)
左手右手慢动作

是這樣的,第一種是現在ObjC單例的標準代碼。

+ (User *)shareUser {
static User *_sharedSingleton = nil; //静态全局变量
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
    _sharedSingleton = [[self alloc] init]; //dispatch once 保证大括号里的代码只执行一次
});
return _sharedSingleton;
}

這種方式的單例,是ARC(自動記憶體管理)模式下的標準形式,外部呼叫時,直接[类名 shareUser]获取单例,记得h文件中要写接口,不要使用_sharedSingleton

xxx.h

@interface xxx : xxx
{

}
+ (instancetype)shareUser;
@end

這裡的instancetype傳回目前類別的型別。

至於第二段程式碼把static User *_sharedSingleton = nil;写成全局变量,是MRC时代的写法,包括重写(id)allocWithZone:(NSZone *)zone等方法,也是舊式寫法。

小葫芦

static關鍵字修飾的靜態變數的生命週期都是一樣的,編譯時初始化,只有當程式退出後記憶體才會釋放!然而,變數是存在作用域的,就例如你的第一種寫法,這個變數是一個局部靜態變量,只能在這個方法中使用!而你的第二種寫法,這個變數是一個全域靜態變量,可以全域使用

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板