@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