我使用類似下面的東西。與@Quinn Taylor發佈的版本不同,此版本具有以下屬性:
- 創建
NSAutoreleasePool
以確保存在池。在處理諸如代碼的「啓動」時最好假設最差。如果游泳池已經存在,則無害。
- 創建
cache
恰好一次:
- 安全地調用
+initialize
多次(通過子類可能發生)。
- 多線程安全。不管有多少線程同時在同一時間呼叫
+initialize
,cache
保證只能創建一次。 '贏得'原子CAS的線程保留cache
,這是'鬆'autorelease
他們的嘗試的線程。
如果你想成爲非常保守,你可以添加斷言檢查這兩個pool
和initCache
不NULL
。另外請注意,這不會確保cache
一旦創建就以多線程安全的方式使用。
#include <libkern/OSAtomic.h>
static NSMutableDictionary *cache;
+ (void)initialize
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSMutableDictionary *initCache = [[[NSMutableDictionary alloc] init] autorelease];
_Bool didSwap = false;
while((cache == NULL) && ((didSwap = OSAtomicCompareAndSwapPtrBarrier(NULL, initCache, (void * volatile)&cache)) == false)) { /* Allows for spurious CAS failures. */ }
if(didSwap == true) { [cache retain]; }
[pool release];
pool = NULL;
}
複製http://stackoverflow.com/questions/554969/using-static-keyword-in-objective-c-when-defining-a-cached-variable – joshperry 2010-01-12 01:19:37