block是一種資料型別,封裝了一段**
,可以在任何時候執行。
block
可以在程式執行時儲存一段**(函式不行)。block
跟函式一樣,有返回值,形參。
block:
以「^」表示一段
block
block變數:
以「返回值型別 (^block
名稱)(
形參型別
)」表示乙個
block
型別的變數。和以前學過的
c語言的指向函式的指標很像。如果沒有形參,則
(形參型別
)可以省略。
用block
變數呼叫
block
裡面的內容:
block名稱
();沒有返回值和形參的block:
帶形參和返回值的block:
每次我們要定義乙個block
型別變數,都要寫一大串**,利用
c語言中的
typedef
函式可以簡化我們的定義。
#import typedef int (^myblock)(int, int);
int main(int argc, const char * argv)
; nslog(@"%d", sumblock(3, 6));
return 0;
}
預設情況下,block
對外面變數是唯讀的,如果想要某個變數能在
block
內部修改,需要在變數前加上
__block
關鍵字。如
__block int sum = 10;
protocol是意思是協議。在計算機網路課程中,我們學過各種網路協議。
oc中的
@protocol
可以模擬著學習,
protocol在oc
中的作用就是宣告一堆方法。
和建立類類似,右擊專案,在new file
中選擇objective-c protocol
,然後給協議取個名字即可。
1)協議的編寫:
@protocol 協議名稱
@關鍵字
方法宣告
@end
關鍵字有@required
和@optional
@required要求遵守協議的類必須實現,
@optional
是可選實現,預設是
@required
2)某個類遵守協議(可遵守多個):
@inte***ce 類名 : 父類
協議名稱
1,協議名稱
2>
@end
和類的繼承、基類類似,乙個協議遵守了其他協議,就相當於擁有了其他協議中的方法宣告,和類不同的是,乙個協議可以遵守多個協議。
@protocol 協議名稱 協議1, 協議2
>
@end
和基類一樣,基協議名稱也叫nsobject
。開啟nsobject.h
發現裡面有我們記憶體管理方法的宣告,可是我們之前學記憶體管理的時候沒有用過基協議呀?
那是因為,基類本身繼承了基協議,我們繼承基類,也就預設遵守了基協議。
// nsobject型別的物件,並且要遵守myprotocol協議
nsobject*obj;
// 任何oc物件,並且要遵守myprotocol協議
idobj;
// 呼叫set方法要遵守myprotocol協議
@property (nonatomic, strong) idobj;
當賦值給obj的物件不遵守
myprotocol
時,編譯器就會發出嚴重警告
最後需要補充的是,在類裡面我們學過,如果編譯器不需要用到類裡面的內容,只需要知道它是乙個類,使用@class
關鍵字。協議同樣也有這種用法,在只需要知道協議的地方不用
#import
,使用@protocol
,在真正用到協議裡面方法宣告的檔案裡,才用
#import。
OC學習筆記之block
一 什麼是block block是oc中的乙個資料型別,但是它很特別,因為它是用來儲存一段 的 可以理解為把一段 賦值給block型別的變數 它和函式有點相似,它可以帶引數,可以有返回值,呼叫方式也一樣。二 定義乙個不帶形參沒有返回值的block main.m block created by 葬花...
OC學習筆記(1) block
斷斷續續,今天又開始學oc了 今天的內容是 block block 是用來儲存一段 block 的標記是 block 和 其它語言的函式很像 1.可以儲存 2.有返回值 3.有形參 4.呼叫方式一樣 定義 block 變數的方法如下 void myblock int c sumblock 10,20...
Oc課堂筆記 Block塊
block塊 可以傳到任何地方使用 託字元 1.無返回值 無引數的block void myblock myblock 2.有返回值有引數 nsinteger sumblock nsinteger,nsinteger nsinteger num1,nsinteger num2 sumblock 10...