Object-C 一些關鍵字的理解 @synchronized、__block、class等。。。

@synchronized html

當 Objective-C 中有兩個線程同時修改同一個對象。爲了防止多個線程同時執行同一個代碼塊,OC 提供了@synchronized() 指令。安全

使用 @synchronized() 指令能夠鎖住在線程中執行的某一個代碼塊。存在被保護(即被鎖住)的代碼塊的其餘線程,將被阻塞,這也就意味着,他們將在 @synchronized() 代碼塊的最後一條語句執行結束後才能繼續執行。多線程

@synchronized() 指令的惟一參數可使用任何OC對象,包括self。這個容許線程鎖住一個代碼塊以防它被別的線程使用。你應當使用不一樣的信號量來保護程序中不一樣可以的關鍵部分。最安全的是,在應用程序進入多線程以前,爲全部須要互斥的建立互斥信號量。.net


__block線程

__block 的標記告訴編譯器,這個變量在 block 裏面須要作特殊處理。代理

通常來講,在 block 中用的變量值是被複制過來的,因此對於變量自己的修改並不會影響這個變量的真實值。而當咱們用 __block 標記的時候,表示在 block 中的修改對於 block 外也是有效地。code

extern NSInteger CounterGlobal;
static NSInteger CounterStatic;
 
{
    NSInteger localCounter = 42;
    __block char localCharacter;
 
    void (^aBlock)(void) = ^(void) {
        ++CounterGlobal;
        ++CounterStatic;
        CounterGlobal = localCounter; // localCounter fixed at block creation
        localCharacter = 'a'; // sets localCharacter in enclosing scope
    };
 
    ++localCounter; // unseen by the block
    localCharacter = 'b';
 
    aBlock(); // execute the block
    // localCharacter now 'a'
}

在上面的代碼裏,localConter 和 localCharacter 都在 block 中有所修改,可是在 block 裏面,只有 localCharacter 的修改是有效的,緣由是 __block 標記起了做用。而在 block 中對於 localCharacter 的修改在 block 外也是可見的。htm

class(類的聲明)對象

聲明是一個類,可是調用不了這個類裏面的方法。

Category(分類)blog

對類進行擴展,只能擴展方法,不能擴展成員變量,不須要建立子類,也不須要知道其源代碼

//建立一個分類,新添test2方法。
Student+Test.h分類聲明文件中
#import 「Student.h」
@interface Student (Test)  //()表明是一個分類,括號中的名稱表明分類名稱
-(void) test2
@end

protocol(代理、協議)

block(代碼塊)

ps:

http://blog.sina.com.cn/s/blog_4cd8dd130100wx85.html

http://m.blog.csdn.net/blog/ds1919/36383253

相關文章
相關標籤/搜索