iOS中的單例你用對了麼?

2021-08-13 09:40:57 字數 1541 閱讀 5849

單例模式怎麼定義的,可能在不同的語言,不同的書中不完全一樣,但是概況開來都應該是:乙個類有且僅有乙個例項,並且自行例項化向整個系統提供。

因此,首先你可能需要確定你是真的需要乙個單例類,還是說僅僅是需要乙個方便呼叫的例項化方法。如果你是真的需要乙個單例類,那麼你就應該確保這個單例類,有且僅有乙個例項(不管怎麼操作都只能獲取到這個例項)。

最近看到一些github上的單例使用,別人的用法,有一些思考,然後寫demo測試了下,就這個簡單的單例也有一些坑呢,希望能給他人一些提醒。

我們通常在oc中實現乙個單例方法都是這樣

static hltestobject *instance = nil;

+ (instancetype)sharedinstance

); return instance;

}

可是這樣就可以了麼?我做了如下測試:

hltestobject *objct1 = [hltestobject sharedinstance];

nslog(@"%@",objct1);

hltestobject *objc2 = [[hltestobject alloc] init];

nslog(@"%@",objc2);

hltestobject *objc3 = [hltestobject new];

nslog(@"%@",objc3);

看到這個測試,你想到列印結果了麼?結果是這樣的:

2016-05-23 12:52:57.095 practiseproject[3579:81998] 2016-05-23 12:52:57.095 practiseproject[3579:81998] 2016-05-23 12:52:57.095 practiseproject[3579:81998]

很明顯,通過三種方式建立出來的是不同的例項物件,這就違背了單例類有且僅有乙個例項的定義。

為了防止別人不小心利用alloc/init方式建立示例,也為了防止別人故意為之,我們要保證不管用什麼方式建立都只能是同乙個例項物件,這就得重寫另乙個方法,實現如下:

+ (instancetype)allocwithzone:(struct _nszone *)zone

); return instance;

}

再次用上面的測試**,結果是這樣的:

2016-05-23 12:57:37.396 practiseproject[3618:83975] 2016-05-23 12:57:37.396 practiseproject[3618:83975] 2016-05-23 12:57:37.396 practiseproject[3618:83975]

注意如果單例有屬性的話,不要重寫init方法, 在

+ (instancetype

) sharedinstance

方法中初始化,即可,不然,呼叫init的時候,初始化的屬性會覆蓋之前的屬性

span 居中 元素居中,你真的用對了麼?

元素居中,你真的用對了麼?元素居中有很多方法,在開發的時候用對乙個正確的方法,不僅可以給我們的開發省時間省 還能達到不錯的頁面效果,下面就元素居中介紹如下 在塊級元素 中讓行內元素demo水平垂直居中可以使用 此方法可以讓行內塊元素,塊級元素,和行內元素在乙個非行內元素內水平居中顯示,已經浮動或定位...

你的float用對了嗎

很多人都知道float是浮點型別,它不能表示資料範圍內的所有數值。但是,實際使用或編碼時,你又是否記得這句話呢?下面是stackoverflow中的乙個問題 why does a float variable stop incrementing at 16777216 下面是待執行的 float a...

iOS中的單例

單例模式用於當乙個類只能有乙個例項的時候,通常情況下這個 單例 代表的是某乙個物理裝置比如印表機,或是某種不可以有多個例項同時存在的虛擬資源或是系統屬性比如乙個程式的某個引擎或是資料。用單例模式加以控制是非常有必要的。單例模式需要達到的目的 1.封裝乙個共享的資源 2.提供乙個固定的例項建立方法 3...