今天用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的時候,沒有解鎖,導致程式死鎖。下面是乙個...