iOS自動解鎖的實現

2021-06-27 04:51:21 字數 1988 閱讀 4396

今天用clang將objective-c語言轉換成cpp時,發現乙個對變數的作用域有趣的用法。當我們用@autorelease{}時,將轉換為以下形式(已移除無關**):

int main(int argc, const char * argv) }}

return 0;

}

那麼 __atautoreleasepool 是什麼呢?

struct __atautoreleasepool 

~__atautoreleasepool()

void * atautoreleasepoolobj;

};

好傢伙!原來是乙個在建構函式裡面push了乙個新的自動釋放池,並在析構函式裡面pop它。那麼開頭的 就好理解了:這裡宣告了乙個 __atautoreleasepool型別的 __autoreleasepool變數,通過變數在初始化的時候呼叫建構函式來建立乙個新的自動釋放池,並在變數的作用域結束時,自動呼叫析構函式來釋放自動釋放池。

那麼還有什麼地方可以用這種小技巧來提高開發效率呢? ——鎖。

@inte***ce autolock : nsobject

+ (instancetype)lock:(nslock *)lock;

- (instancetype)initwithlock:(nslock *)lock;

@end

@implementation autolock

+ (instancetype)lock:(nslock *)lock

- (instancetype)initwithlock:(nslock *)lock

return self;

}- (void)dealloc

//使用

- (void)dosomething

這時候編譯器會提示 autolock 變數未使用。

可以使用以下三種形式消除警告

使用#pragma clang diagnostic ignored "-wunused-variable"

使用 #define unused(_ivar) (void)(_ivar); 

使用編譯器變數屬性 __attribute__((unused))

查閱了gcc關於__attribute__說明,發現__attribute__((cleanup_function))屬性。gcc說明如下:

cleanup (cleanup_function) 

簡單來說,就是在修飾的變數作用域結束時,將自動呼叫cleanup_function函式。cleanup_function必須帶有乙個指向修飾變數的位址的引數。這時候,可以傳入乙個block的變數位址,並在cleanup_function執行這個block。

static void _autolock(void (^ __strong *lockblock)())
為了可以將這個函式作為清理函式,這就需要我們定義的變數是乙個void (^ __strong)() 型別的block。並且在block裡面解鎖。

nslock *lock = [[nslock alloc] init];

[lock lock];

void (^__strong autolock)() __attribute__((cleanup(_autolock), unused)) = ^;

我們還可以將上面的定義成乙個巨集

#define auto_lock(__lock) \

[__lock lock]; \

void (^ __strong autolock)() __attribute__((cleanup(_autolock), unused)) = ^\

;

使用如下

- (void)dosomething

SQL自動解鎖

在資料庫系統中,作為任務,每1分鐘執行一次。取消程序的條件 1 鎖住了其他程序。2 自身沒有被其他程序鎖住。3 此程序已經空閒了2分鐘以上。declare user id int killcmd varchar 100 wait time int 設定空閒時間 set wait time 2 根據選...

iOS 小的Demo 簡單的手勢解鎖實現

晴川歷歷漢陽樹,芳草萋萋鸚鵡洲 好運蛋 先上效果圖 密碼是3548 前奏 這個可以說是在簡易的畫板之上,增加一些判斷就可以完成,首先我們肯定需要九個圓圈的放置,我思考的就是用九個 uiview 迴圈的方法布置一下各自位置 畫圖 乙個簡單的想法就是,在九個 view 所屬的大 view 畫線,只要經過...

Qt QMutexLocker 自動解鎖的機制

qmutexlocker 是乙個便利類,它可以自動對qmutex加鎖與解鎖。因為qmutexlocker 申請的這個lock變數在這個函式退出時,自動的呼叫析構函式來解鎖。這樣可以防止在程式編寫的過程中,不同的地方有多個return的情況,在發生return的時候,沒有解鎖,導致程式死鎖。下面是乙個...