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...