OC特有語法 Block

2021-07-04 05:01:13 字數 1833 閱讀 9303

block:

與函式指標的比較:

有點像函式指標,

可以作為引數傳遞,作為函式返回值

函式指標:

void

(*mypoint

)()=test

; //

指向函式的指標。儲存函式名代表的指標變數

mypoint

();

block

彌補了指向函式的指標不能夠直接儲存乙個函式體

void

(^myblock

)()=^

(1)定義block變數

int (^sumblock)(int,int);//有引數,返回值型別為

int

void (^myblock)();

//無引數,返回值型別為空

(2)利用block

封裝**

(3)block訪問外部變數

1)block內部可以訪問外部變數;

2)預設情況下,block

內部不能修改外部的區域性變數

3)給區域性變數加上__block

關鍵字,則這個區域性變數可以在

block

內部進行修改。

(4)利用typedef

定義block型別(

和指向函式的指標很像)

typedef int(^myblock)(int ,int);

1)定義block

變數:

myblock a,b;  

a=^(int a,int b);

myblock b2=^(int n1,int n2)

2)作為引數傳遞:

-(int)calculatewithnumber1:(int)number1 andnumber2:(int)number2

andcalculateblock:(myblock )calculate

(3)作為屬性:

@property (nonatomic, copy) void (^testblock)();  

// 1.如果沒有對block進行copy操作,block就儲存於棧空間

// 2.如果對block進行copy操作,block就儲存於堆空間

// 3.如果block儲存於棧空間,不會對block內部所用到的物件產生強引用

// 4.如果block儲存於堆空間,就會對block內部所用到的物件產生強引用

lperson *p =[[lperson alloc] init];

//解決辦法:

_weak typeof (p) weakp = p;

p.testblock = ^     

非arc:

__block typeof(p) weakp = p;

//    p.testblock = ^;

即:block的使用注意:

1>   block的記憶體管理

2>   防止迴圈retian

l  非arc(mrc):__block

l  arc:__weak\__unsafe_unretained

int age = 10;

void (^block)() = ^;

age = 20;     

列印10.               __block int age = 10;(可以在block改值,動態取age的值,相當於nslog(@"age=%d",*&(age)),傳的是位址)  列印20  static int age = 10;  列印20

OC 特有語法1

asp.net unity開發 net培訓 期待與您交流!一 利用點語法替換set方法和get方法 1.方法呼叫 student stu student new stu setage 10 int age stu age 這是set和get的物件呼叫方法 2 點語法 stu.age 10 int a...

OC特有語法 多型

多型 指標以父類型別宣告,但實際執行時指向的是其某個子類的物件,當用這個指標呼叫方法時,會根據其指向的不同子類物件呼叫不同的物件方法。這種現象叫多型。多型的前提是子類會覆蓋父類的方法。多型的應用 需要乙個新的函式專門用來餵狗 void feed dog d 如果這個時候也需要喂貓,那就應該重寫新乙個...

OC特有語法 SEL

sel就是對方法的一種包裝。包裝的sel型別資料它對應相應的方法位址,找到方法位址就可以呼叫方法。在記憶體中每個類的方法都儲存在類物件中,每個方法都有乙個與之對應的sel型別的資料,根據乙個sel資料就可以找到對應的方法位址,進而呼叫方法。inte ce person nsobject void t...