block在ios開發中使用頻率非常高, 現總結一篇block基本用法和大家分享一下!
定義格式:= ^返回值(引數)
, 可以使用快捷鍵inline
, 如果沒有引數或者返回值, 返回值和引數都可以省略
和函式功能相似, 儲存一段**.
block的呼叫是直接去呼叫的.
block();
在person類中定義乙個block屬性
@property(nonatomic ,strong) void(^programmer)();
在tableviewcontroller類中定義block
person *person1 = [[person alloc] init];
person.programmer = ^;
person *person2 = [[person alloc] init];
person.programmer = ^;
person *person3 = [[person alloc] init];
person.programmer = ^;
//新增進persons陣列
self.persons = @[person1,person2,person3];
在cell資料來源方法中呼叫
person *person = self.persons[indexpath.row];
if (person.programmer)
傳值有兩種情況:
@property (nonatomic, strong) void(^valueblock)(nsstring *);
在下乙個控制器中定義block, 把值傳進去
if (_valueblock)
nextvc.valueblock = ^(nsstring *value);
block作為引數, 一般在框架中使用較多.
例如: 封裝乙個加法類
在add類中定義乙個帶有block引數的方法
@property (nonatomic, assign) int result;
// int(^(int): 引數型別
-(void)add(int(^(int))addblock;
在外部controller類中定義block. 外界可以在block中隨意做一些操作, 這些操作的結果都會作為引數傳給內部
add *add = [[add alloc] init];
[add add:^int(int result)];
在add類中呼叫block, 可以直接呼叫. 也可以先儲存起來, 再在合適的地方呼叫
- (void)add:(int (^)(int))addblock
在add類定義宣告乙個返回值為block的方法
@property (nonatomic, assign) int result;
- (void(^)(int value))add;
在外部類中呼叫block
add *add = [[add alloc] init];
add.add(5);
在add類中實現方法
- (void (^)(int value))add
;}
1. 迴圈引用問題
block會把外界的強指標強引用預設區域性變數都是強指標
__weak typeof(self) weakself = self;
typeof(self) strongself = weakself;
2. 變數引用問題bock引用變數: 全域性變數,靜態變數,__block都是指標傳遞. 區域性變數是值傳遞
釋義:
預設block引用外部的區域性變數,並且沒有任何關鍵字修飾,都是值傳遞
如果外部變數用__block或者static修飾,就是指標傳遞,外面改了,裡面也會改
只要是全域性變數,block也是指標傳遞
3. 記憶體管理
mrc釋義:block沒有訪問外部變數,在全域性區
如果訪問了外部變數,預設block在棧中
mrc中用copy, block才會放在堆中儲存.
如果block沒有訪問外部的區域性變數,或者訪問的變數被static修飾,或者訪問全域性變數,那麼這個block就是全域性的
如果block訪問外部的區域性變數,那麼這個block在棧裡面的.
block如果想儲存到堆裡面,只能使用copy,不能使用retain,使用retain還是在棧裡面.
arc釋義:如果訪問了外部變數,預設block在堆中
如果block訪問外部的區域性變數,那麼這個block在堆裡面的.
在arc中,block使用strong,放在堆裡面儲存
能使用strong,就不要使用copy.
記憶體中幾個區
全域性區:儲存全域性變數常量區:儲存常量
堆:手動去管理記憶體,物件
棧:基本變數,int,指標,自動管理
方法區:儲存函式
block 基本用法
專門處理 需要重複呼叫的 block 返回值相同,引數相同 在.h檔案中,宣告 typedef void typedefblock nsstring typedef int typedefbock2 inta,intb ibaction testaction id sender oc語言 self ...
block用法小計
預設情況下,任何block都是在棧中,隨時可能會被 對block設定copy屬性,block的記憶體就會放到堆裡面。book b book alloc init b.block 如果像上述寫法block所指向的 塊會強引用book的記憶體位址,使得book物件不能釋放,造成記憶體洩露。book b ...
Block用法解析
block 塊是對c做出的乙個補充,初次體驗 塊,無比的不適應。古怪的語法確實讓人不易入門甚至精通。但若能夠深入精通block的使用,會給 帶來層次上的提公升。block就是一段在將來被執行的 塊返回值型別 形參型別1 形參1,形參型別2 形參2,塊返回值型別 塊變數名 形參型別1,形參型別2,定義...